事务基本要素
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.这样读取时只能读到原数据行了.