数据库事务的隔离级别
事务的隔离级别分为以下四种:
对事务的基本操作
/*查看事务的隔离级别*/
SELECT @@tx_isolation;
/*查看事务是否自动提交*/
SELECT @@autocommit;
/*设置隔离级别为读已提交*/
SET tx_isolation='READ-UNCOMMITTED';
/*设置隔离级别为读已提交*/
SET tx_isolation='READ-COMMITTED';
/*设置隔离级别为可重复读*/
SET tx_isolation='REPEATABLE-READ';
/*设置隔离级别为可串行化*/
SET tx_isolation='Serializable';
/*设置事务不自动提交*/
SET autocommit=off;
读未提交:
开启一个事务T1之后,进行相关的操作,还没有提交的前,开启另一个事务T2,在READ-UNCOMMITTED这种事务隔离级别下,T2是能够感知事务TI所进行的操作的,即使事务T1并没有提交。
可能出现的问题:出现脏数据。如事务T1把某条数据更新了,还没有进行提交,这时候事务T2查询到刚才更新的数据,事务T1遇到了一个异常进行回滚,还原到之前的数据,而此时事务T2之前读取到的数据相当于就是无效的数据,我们称之为‘脏数据’。
读已提交
为了防止在脏数据的产生,可以事务的隔离级别提升到READ-COMMITED级别。即只有在一个事务提交之后,另一个事务才能够感知。
可能出现的问题:不可重复读。即在事务T1有两次查询,第一次查询的时候,比如查询id=1的username为张三,此时事务T2将id=1的username改为了李四,而事务TI再进行第二次查询的时候,会发现同一个事务中的两次查询竟然不一样,这时候我们称之为‘不可重复读’.
可重复读
为了解决读已提交中的出现的问题,可以将事务的隔离界别提升到REPEATABLE-READ。即在一个事务T1进行操作的时候,不允许另一个事务T2对T1操作的数据项进行更新操作。
可能出现的问题: 幻读,虽然事务T1在进行相应操作的时候,事务T2不能对事务T1操作的数据项进行跟新,但是可以惊醒Insert或者delete操作。比如事务T1查询id>1的开始有1条数据的话,提示事务T2插入的一条数据,其Id大于1,则事务在进行查询的时候,则数据的记录数则不相同了,对此,我们称之为‘幻读’。
可串行化
事务的*别,事务应该一条一条的进行操作,相应的其操作的吞吐量也会大大降低。
mysql中,事务的隔离级别默认的为REPEATABLE-READ。
下一篇: .Spring Data所解决的问题