MySQL事务隔离级别

        大家都知道,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:

  1. 读未提交:在A中修改后先不提交,此时B中的select查到的数据已经是修改过后的数据了。会产生脏读问题。
  2. 读提交:在A中修改后先不提交,此时B中的select查到的数据仍然是修改之前的数据;然后在A中commit提交,B中select查到的数据才是修改过后的数据。解决了脏读问题,但出现了不可重复读的问题。
  3. 可重复读:事务不会读到其他事务对已有数据的修改,即使事务已提交。即,在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的数据又出现了???这种现象就是幻读)。
  4. 串行化:执行流程相当于把事务的执行过程变为顺序执行,相当于单线程,后一个事务的执行必须等待前一个事务执行完毕。隔离效果最好,解决了上述所有问题,但效果最差。

        所以,上述隔离级别的效果是逐渐增强,但性能是越来越差。

 

posted @ 2023-03-20 11:35  Sunshine_y  阅读(138)  评论(0编辑  收藏  举报