技术学习Python

数据库事务

2019-02-03  本文已影响2人  Waisam

事务特性

并发事务的问题

幻读和不可重复读的区别

事务隔离级别

SQL标准定义了4类隔离级别,每一种级别都规定了一个事务中所做的修改,哪些在事务内和事务间是可见的,哪些是不可见的。

数据库记录.png

数据操作

一致性读

Mysql的一致性读是通过read view结构来实现。
read view主要是用来做可见性判断的,它维护的是本事务不可见的当前其他活跃事务。其中最早的事务ID为up_limit_id,最迟的事务ID为low_limit_id

    trx_id_t    low_limit_id;
                /*!< The read should not see any transaction
                with trx id >= this value. In other words,
                this is the "high water mark". */
    trx_id_t    up_limit_id;
                /*!< The read should see all trx ids which
                are strictly smaller (<) than this value.
                In other words,
                this is the "low water mark". */

如何理解low_limit_id

可以参考知乎这个答案来理解。low_limit_id应该是当前系统尚未分配的下一个事务ID,也就是目前已经出现过的事务ID的最大值+1

image.png

可见性判断

假设要读取的行的最后提交事务id(即当前数据行的稳定事务id)为 trx_id,可见性比较过程如下:

  1. trx_id < up_limit_id => 此记录的最后一次修改在read view创建之前,跳转到步骤5;
  2. trx_id > low_limit_id => 此记录的最后一次修改在read view创建之后,跳转到步骤4;
  3. up_limit_id <= trx_id <= low_limit_id => 从up_limit_id到low_limit_id进行遍历,如果trx_id等于他们之中的某个事务id的话,表示该记录的最后一次修改尚未保存,跳转到步骤4。否则跳转到步骤5;
  4. 从此记录的DB_ROLL_PTR指针所指向的undo log(此记录的上一次修改),将undo log的DB_TRX_ID赋值给trx_id,跳转到步骤1重新开始计算可见性;
  5. 如果此记录的DELELE_BIT为false,说明该记录未被删除,可以返回,否则不返回。

RR和RC隔离级别

Repeatable Read和Read Committed隔离级别都是基于read view来实现,不同之处在于:

对于InnoDB来说,Repeatable Read虽然比Read Committed隔离级别高,开销反而相对较小。

参考资料

数据库事务与MySQL事务总结
MySQL-InnoDB-MVCC多版本并发控制
MySQL InnoDB MVCC深度分析
乐观锁和 MVCC 的区别?
MySQL 在 RC 隔离级别下是如何实现读不阻塞的?

上一篇 下一篇

猜你喜欢

热点阅读