大家都知道,MySQL的事务特性ACID,那么本文就针对I(隔离性)做出详细说明。
MySQL中事务的隔离级别分为四大等级,分别是读未提交READ UNCOMMIT、读提交READ COMMIT、可重复读REPEATABLE READ(MySQL默认的隔离级别)、串行化SERIALIZABLE。在MySQL中可通过select @@transaction_isolation;查看当前隔离级别、set global/session transaction isolation level read commit;指定新的隔离级别,此处的global代表全局有效,session代表当前会话窗口有效。在设置完隔离级别后,对于之前打开的会话是无效的,需要重新打开新窗口才会生效。
事务的一般流程为:begin/start transaction开启事务-->SQL语句修改-->commit提交。同时开启两个事务A和B:
- 读未提交:在A中修改后先不提交,此时B中的select查到的数据已经是修改过后的数据了。会产生脏读问题。
- 读提交:在A中修改后先不提交,此时B中的select查到的数据仍然是修改之前的数据;然后在A中commit提交,B中select查到的数据才是修改过后的数据。解决了脏读问题,但出现了不可重复读的问题。
- 可重复读:事务不会读到其他事务对已有数据的修改,即使事务已提交。即,在A中修改后并且提交后,B中查到的数据仍然是未修改的数据(事务A和B必须同时打开)。解决了脏读与不可重复读问题,但出现了幻读问题,幻读一般是针对insert(什么是幻读?比如A查询ID=100,发现不存在此行,Empty Set。此时B通过insert新增了一条ID为100的数据,而由于A认为该表中没有ID为100的数据,因此A也插入一条ID为100的数据,此时报错ID冲突,A感到很奇怪又select了一下,发现ID为100的数据又出现了???这种现象就是幻读)。
- 串行化:执行流程相当于把事务的执行过程变为顺序执行,相当于单线程,后一个事务的执行必须等待前一个事务执行完毕。隔离效果最好,解决了上述所有问题,但效果最差。
所以,上述隔离级别的效果是逐渐增强,但性能是越来越差。
标签:事务,隔离,数据,提交,MySQL,级别,ID From: https://www.cnblogs.com/TzySec/p/17235763.html