今天介绍下,在 MySQL
的 InnoDB
存储引擎中,事务隔离是如何实现的。
InnoDB
里面每个事务有一个唯一的事务 ID
,叫作 transaction id
。它是在事务开始的时候向 InnoDB
的事务系统申请的,是按申请顺序严格递增的。
对于数据库的每行记录,都会有三个隐藏字段:db_trx_id (事务 id)
、db_roll_pt (回滚指针)
、delete_flag(删除标记)
。— 有懂的朋友,还望别细纠,其实 delete_flag
是在头信息中,这里是为了方便理解
对于 DML
操作来说:
- INSERT:创建一条数据,
db_trx_id
的值为当前事务id
,db_roll_pt
为null
。 - UPDATE:复制一行数据,将当前复制后这一行的
db_trx_id
置为当前事务的id
,db_roll_pt
是一个指针,指向复制前的那一条的。 - DELETE:复制一行数据,将当前复制后这一行的
db_trx_id
置为当前事务的id
,db_roll_pt
是一个指针,指向复制前的那一条的。并把delete_flag
置为true
。