mysql事务

187 阅读2分钟

事务基本要素

acid

Atomicity

Isolation

Consistency

Durability

问题

脏读: 读到未commit并回滚的数据

不可重复读: 多次读取读到的是不同的数据.本质是读到其他事务commit之后更新的数据

幻读: 范围查询时读到其他事务新插入的数据,多了n条;获得做修改操作时发现有n条数据未修改,本质也为其他事务写入了数据. 解决办法: msyql 快照;表锁.

Mysql事务隔离级别

  • Read-uncommited 问题:脏读
  • Read-commited 问题:不可重复读
  • Repeatable-read 问题:幻读(因为采用了MVCC,mysql不会出现幻读)
  • Serializable 无问题

相关知识点:

MVCC(Multi Version Concurrency Control的简称),代表多版本并发控制

  • 乐观锁: 自己添加version,更新操作时,如果版本号不一致操作失败.

  • 悲观锁: 操作前必须先加锁.数据库实现,见以下几种锁.

  • IS共享锁 lock in share mode 适用于多张表保持一致性的需求 为了让自己查到的数据确保是最新数据,并且查到后的数据只允许自己来修改的时候,需要用到 for update 子句。

  • IX排它锁 for update 适用于单张表保持一致性的需求 为了确保自己查到的数据没有被其他的事务正在修改,也就是说确保查到的数据是最新的数据,并且不允许其他人来修改数据。但是自己不一定能够修改数据,因为有可能其他的事务也对这些数据 使用了 in share mode 的方式上了 S 锁。

  • Mysql如何避免幻读 在快照读读情况下,mysql通过mvcc来避免幻读。 在当前读读情况下,mysql通过next-key来避免幻读

  • MVCC机制原理:每一行增加创建事务ID和删除事务ID,ID递增,读操作读取addId<=当前事务id and delId 不存在 或 大于当前事务Id;更新操作实际为新写入一行,创建事务id为当前事务id;删除id为空.原行删除事务id为当前id.这样读取时只能读到原数据行了.

参考文档:

MySQL的四种事务隔离级别

深入理解...

select for update/lock in share mode 对事务并发性影响

mysql Innodb在RR级别如何避免幻读

轻松理解MYSQL MVCC 实现机制

mysql锁(九)innodb下的记录锁,间隙锁,next-key锁