脏读:一个事务A读取到另外一个事务B没有提交的数据,本质是事务B对其他事务可见,未提交的数据被事务A读取了(读的是别人没提交的数据)
不可重复读:同一个事务A读了一条数据读了两次,两次返回的记录数据不一样。本质是事务A多次读取,在多次读取的过程中,其他事务对该数据进行了修改。(读多次过程中别人提交了的数据)
幻读:同一个事务读了两次,两次返回的记录数量不一样。(insert从锁的角度讲,mysql行锁下无法阻塞新增行操作)
read-uncommited(不用)
read-committed解决脏读
repeatable-read解决不可重复读
serializable解决幻读
?
死锁:指两个或多个事务在同一资源上相互占用,并请求锁定对方占用的资源。
死锁条件:多个事务,不一定多条sql语句,在加锁的顺序上不同,互相占用了对方的资源
死锁原因:数据冲突或者存储引擎的实现方式
mysql两种事务型存储引擎:innoDB和NDB Cluster
mysql非事务型存储引擎:myisam
在事务中混合使用存储引擎是不可靠的,正常提交没问题,如果混合使用提交后需要回滚,非事务型存储引擎无法回滚,数据与原始状态处于不一致。
innoDB采用两阶段锁定协议(two-phase locking protocol)在事务执行过程中,随时可以执行锁定,只会在commit和rollback的时候同一时刻所有的锁被释放。
在MVCC多版本并发控制中,读操作可以分成两类:快照读 (snapshot read)与当前读 (current read)。
行级锁{共享锁和排他锁}
共享锁lock in share mode:多个事务只能读数据,不能改数据
排他锁for update:其他事务不能再在其上加其他的锁
MVCC多版本并发控制:
innoDB的MVCC:在每行记录后面记录两个隐藏的列,一个列记录系统版本号,另一个保存删除版本号,每个事务开始,系统版本好自动递增。
Repeatable read隔离级别下MVCC:
select:查找版本号小于等于当前版本号的数据行 and(删除版本号大于当前版本号or删除版本号未定义的数据行)
insert:为当前插入的数据行保存当前系统版本号
delete:删除的数据行保存当前系统版本号作为行删除标识
update:为插入一行新纪录,保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行作为行删除标识
牺牲空间来满足性能,大多数读操作将不用加锁(注:只在RR和RC隔离级别下工作)