MySQL 事物

MySQL 事物

Posted by ZW on April 10, 2019

定义

一组原子性的sql,要么都执行,要么都不执行。特性:ACID(原子性,一致性,隔离性,持久性)

隔离级别

  1. 未提交读。一个事物可以读取另一个事物中还没提交的数据(脏读)
  2. 提交读(又叫不可重复读)。一个事物开始时只能读取已提交的事物的修改(提交读的解释);事物t1开始时,读取行row1,执行事物过程中,A被其他事物t2修改,提交,事物t1再次读取row1,会导致前后读取的结果不一致(即不可重复读).
  3. 可重复读。MySQL默认的事物隔离级别。即一个事物中,无论某时读取的某数据都是一致的。可重复读可能会产生幻读。(InnoDB中通过MVCC已解决幻读)
  4. 可串行化。顾名思义,强制事物串行执行。无并发。所以没有脏读,幻读,不可重复读等现象。但是会导致大量的超时,和锁竞争。

幻读:重点在于 insert读取范围记录。即某个事物读取一个范围的记录时,另一个事物在该范围内新增了一条记录。这个事物再次读取这个范围记录时,就会多一行。

隔离级别 脏读可能性 不可重复读可能性 幻读可能性 加锁读
未提交读 Y Y Y N
提交读 N Y Y N
可重复读 N N Y N
未提交读 N N N Y

死锁

事物1:

   begin:
       lock A
       lock B
   commit;

事物2:

    begin:
       lock B
       lock A
    commit;

多个事物以不同顺序锁定互相依赖的资源时,就有可能产生死锁。MySQL 会回滚其中一个已执行较少操作的事物。

事物日志

存储引擎在修改数据时,修改其内存拷贝,再以追加的方式持久化到磁盘上的事物日志中。因此是采用顺序IO。事物日志持久化后,在后台慢慢的将修改的数据写会磁盘。

参考 《高性能MySQL》