MySQL底层还有几个隐藏字段,比如类似创建事务id、删除事务id
id | name | balance | 创建事务id | 删除事务id |
1 | zhangsan | 450 | 10 | 13 |
2 | wangwu | 600 | 11 | 空 |
2 | wangwu888 | 600 | 13 | 空 |
比如现在开启事务,事务id为13,
①、先删除id=1的记录
②、然后更新id=2的记录,
③、再提交对于删除操作。
mysql底层会记录好被删除的数据行的删除事务id,
对于更新操作 mysql底层会新增一行相同数据并记录好对应的创建事务id
在id为12的事务里执行查询操作mysql底层会带上过滤条件,创建事务id <= max(当前事务id(12),快照点已提交最大事务id),删除事务id> max(当前事务id(12),快照点已提交最大事务id)
通俗的讲:对于上表中的数据是这么来的。
①开始事务,插入了name为zhangsan的数据,事务id为10,此时就会记录创建事务id为10,提交事务
②开始事务,插入了name为wangwu的数据,事务id为11,此时就会记录创建事务id为11,提交事务
③开始事务,更新wangwu这条记录为wangwu666。MySQL底层实际上并不是直接修改了最终数据,而是会生成一条新的记录(PS:这里生成新的记录并不是指真的在我们的数据表里面插入一条记录,而是mysql自己维护的,每更新一次就会有一条新数据)。新数据的id和原来数据的id是一样的,也会有一个创建事务的id,此时事务的id为13,所以记录的为13。
接着在该事物中删除name为zhangsan的数据,这个时候就记录删除事务id为13
注意:begin/start transaction 命令并不是一个事务的起点,在执行到它们之后的第一个操作InnoDB 表的语句,事务才真正启动,才会向mysql申请事务id,mysql内部是严格按照事务的启动顺序来分配事务id的