|
@@ -408,15 +408,24 @@ MySQL 5.5 中引入 MDL,当对一个表进行增删改查的操作时,加MDL
|
|
|
|
|
|
# 事务到底是否是隔离的
|
|
|
|
|
|
+**InnoDB 利用了“所有数据都有多个版本”的这个特性,实现了“秒级创建快照”的能力;联系uodo log**
|
|
|
|
|
|
+## 总结——其一:
|
|
|
|
|
|
+**一个数据版本,对于一个事务视图来说,除了自己的更新总数可见外,有三种情况**
|
|
|
|
|
|
+1. 版本未提交,不可见;
|
|
|
+2. 版本已提交,但是是在视图创建后提交的,不可见;
|
|
|
+3. 版本已提交,而且是在视图创建前提交的,可见。
|
|
|
+4. 当前读,总是读取已经提交完成的最新版本。
|
|
|
|
|
|
+InnoDB 的行数据有多个版本,每个数据版本有自己的 row trx_id,每个事务或者语句有自己的一致性视图。普通查询语句是一致性读,一致性读会根据 row trx_id 和一致性视图确定数据版本的可见性。
|
|
|
|
|
|
+**事务更新的逻辑**
|
|
|
|
|
|
+更新数据都是先读后写的,而这个读,只能读当前的值,称为“当前读”(current read),即更新最新数据,不考虑版本(trx_id)
|
|
|
|
|
|
+除了update语句外,select语句如果加锁,也是当前读
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
+当前读必须要读最新版本 如果此时该行数据上有事物尚未提交,则当前事务必须等待锁
|
|
|
|