MySQL-acid-mvcc以及=事物隔离级别
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MySQL --- acid
A:原子性> 保证一个事务为一个最小的单元,内部不可分割。
C:一致性> 保证事务中的每个操作线程不可单独提交,成功则一起提交,不成功则事务回滚;
I : 隔离性> 保证不同事务间看到的数据视图相互独立,相互隔离。[ 提交读(read committed)和repeatable read(默认)] 这两个事物隔离级别的差别,就是当一个事物开始的时候,始终读取的信息是开始事物的那一刻的数据快照。这样的级别叫repeatable read,提交读就撒始终读取的是最近的数据。其他两个隔离叫未提交读(READ UNCOMMITTED) 和SERIALIZABLE(可串行化) 用的非常少,其中可串行化这个还使用其他的NoSQL队列来代替。
D:持久性> 保证事务提交后数据会持久的保存下来.
Mysql的事务存储引擎Innodb 加锁机制叫多版本并发控制(MVCC)技术以便应对更高的并发,当然是以消耗性能作为代价。简单实现方式如下:
InnoDB实现MVCC的方法是,它存储了每一行的两个(1)额外的隐藏字段,这两个隐藏字段分别记录了行的创建的时间和删除的时间。在每个事件发生的时候,每行存储版本号,而不是存储事件实际发生的时间。每次事物的开始这个版本号都会增加。自记录时间开始,每个事物都会保存记录的系统版本号。依照事物的版本来检查每行的版本号。在事物隔离级别为可重复读的情况下,来看看怎样应用它。
SELECT
Innodb检查没行数据,确保他们符合两个标准:
1、InnoDB只查找版本早于当前事务版本的数据行(也就是数据行的版本必须
小于等于事务的版本),这确保当前事务读取的行都是事务之前已经存在的,
或者是由当前事务创建或修改的行
2、行的删除操作的版本一定是未定义的或者大于当前事务的版本号。确定了当
前事务开始之前,行没有被删除(2)符合了以上两点则返回查询结果。
INSERT
InnoDB为每个新增行记录当前系统版本号作为创建ID。
DELETE
InnoDB为每个删除行的记录当前系统版本号作为行的删除ID。
UPDATE
InnoDB复制了一行。这个新行的版本号使用了系统版本号。它也把系统版本号作为了删除行的版本。
(1) 不是两个,是三个。1DB_TRX_ID:一个6byte的标识,每处理一个事务,其值自动+1,上述说到的“创建时间”和“删除时间”记录的就是这个DB_TRX_ID的值,如insert、update、delete操作时,删除操作用1个bit表示。 DB_TRX_ID是最重要的一个,可以通过语句“show engine innodb status”来查找。