多事务处理数据时遇到的问题和原因
1.脏读(读到了不存在数据)原因:读未提交
2.不可重复读(两次读一条数据,值不一样)原因:读已提交
3.幻读(两次读数据集,数据的条数不一样)原因:表未锁,没有行间锁(间隙锁)
数据库的隔离级别
1.读未提交
2.读已提交
3.可重复读(加锁,读到的东西不可以被修改)
4.序列化
mvcc隔离级别的实现原理
0.数据行的隐藏字段:
数据行id 修改后数据行内容 当前的事务id 回滚id
回滚id 对应的是 undo表中修改前的数据 ,如下
数据行id 本次修改前数据行内容 之前的事务id 之前回滚id
1.读已提交:每条记录有一个事务id,表的每个事务的事务id是递增的,表会保存最大的已提交的事务id,和当前最大的事务id。如果一条事务读一条数据,判断这条数据的事务id是否小于 ”表保存的最大的已提交的事务id“,小于则表示这条数据已提交,否则根据这条数据的rollbackId在undo表中找到旧的数据,直到找到已提交的数据。
2.二级索引只是对主键索引的指针,没有保存真正的数据,需要先找到对应的主键,再寻找数据。
锁
共享锁(share)S
排它锁(exclusive)X
意向共享锁(intent share)IS
意向排它锁(intent exclusive)IX
间隙锁
网友评论