数据库事务的理解

来源:互联网 发布:js 逗号运算符 编辑:程序博客网 时间:2024/06/05 02:27

事务的隔离级别具体是啥就不说了。隔离级别感觉是一次次的迭代的过程。为什么这么说:
- 因为出现了uncommit read中的事务未提交可见。
- commit read解决了此问题,同时又有新的问题产生。
这里写图片描述
2查询到的为 1, 而6查询到为空
- 由于b事务提交完后,2和6查询的结果不相同,不能保证事务的一致性。

-这个可以通过版本控制的快照读解决,在RR级别下对于快照读总是读取事务开始是的数据版本,这也是repeatable read解决内容。
但是这个只能解决快照读的所带来的问题,并不能解决如下的问题:
数据库a有数据1,2,3
在orcal下:
这里写图片描述

2中查询到结果为1,2,由于加了锁(lock in share mode共享锁或者 for update排他锁均可),导致select读取的并非是快照读,而是读取的当前值。
那么mysql是怎么解决rr级别下的此问题
锁的算法
record lock , gap lock, next-key lock
简单来说就是对数据库id为(-∞, 3)的数据进行了锁定。
innnodb的RR事务隔离与orcal以及其他的是有区别的,innodb采用了next-key lock防止了图中第4步的进行。

事物的ACID:
通过redo log(重做日志)保证事务的原子性(A)以及持久性(D);
通过undo log保证事务的一致性(C);
通过锁以及事务隔离级别保证事务的隔离性(I);

undo并不是redo的逆操作;
redo恢复提交事务修改的页操作 物理日志;
undo回滚行记录到特定版本 逻辑日志;

0 0
原创粉丝点击