事务的隔离性
1、修改隔离级别
Set session transaction isolation level read uncommitted;
2、查看隔离级别
Select @@tx_isolation
3、事务的4种隔离级别
(1)读未提交read uncommitted
一个事务可以读到其他事务还没有提交的数据,会出现脏读。一个事务读到了另一个未提交事务修改过的数据,就是脏读。
(2)读已提交read committed
一个事务只能读到另一个已经提交的事务修改过的数据,并且其他事务对该数据进行一次修改并提交后,该事务能查询到最新的值,会出现不可重复读、幻读。
如果一个事务先根据某些条件查询出一些记录,之后另一个事务又向表中插入了符合这些条件的记录,原先的事务再次按照该条件查询,能把另一个事务插入的记录也读出来,这就是幻读。
(3)可重复读repeatable Read
一个事务第一次读过某条记录后,即使其他事务修改了该记录的值并且提交,该事务之后再读该条记录时,读到的仍属第一次读到的值,而不是每次都读到不同的数据,这就是可重复读,这种隔离级别解决了不可重复,但还是会出现幻读。MySQL默认的隔离级别,其内部解决了幻读问题。
(4)串行化serializable
读未提交、读已提交、可重复读这几种隔离级别都允许对同一条记录进行读读、读写、写读的并发操作。如果不允许读写、写读的并发操作时,可以使用serializable隔离级别,这种隔离级别因为对同一条记录的操作都是串行的,所以不会出现脏读、幻读等现象。
注意:
- Read uncommitted隔离级别:可能发生脏读、不可重复读、幻读问题。
- Read committed隔离级别:可能发生不可重复读和幻读,但不会发生脏读问题。
- Repeatable read隔离级别:可能发生幻读问题,不会发生脏读和不可重复读问题。
- Serializable隔离级别:各种问题都不会发生。
- 四种隔离级别是SQL的标准定义,不同的数据库有不同的实现,特别需要注意MySQL在repeatable read隔离级别下,是可以禁止幻读问题的发生的。
欢迎批评指正,提出问题,谢谢!