当前位置:   article > 正文

MYSQL(一) 事务(1)基础_row_get_rec_trx_id

row_get_rec_trx_id

什么是事务:

事务就是由一组SQL组成,或者一个独立的工作单元。

1.事务ACID

原子性(atomicity):
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。因此事务操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响
一致性(consistency):
一致性是指事务必须使数据库从一个一致性状态转换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
隔离性(isolation):
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
持久性(durability)
持久性是指一个事物一旦被提交了,那么对数据库中数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

2.事务的隔离级别

REPEATABLE READ:这是mysql 默认的隔离级别,能不可重复读,其实在这种隔离级别下,脏读也能避免一部分。一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的

READ COMMITTED:一个事务提交之后,它做的变更才会被其他事务看到

READ UNCOMMITTED:一个事务还没提交时,它做的变更就能被别的事务看到。

SERIALIZABLE:串行化 ,可避免脏读、不可重复读、幻读的发生,后访问的事务必须等前一个事务执行完成,才能继续执行

3.多版本控制(MVCC):

一种提高并发的技术。最早的数据库系统,只有读读之间可以并发,读写,写读,写写都要阻塞。引入多版本之后,只有写写之间相互阻塞,其他三种操作都可以并行,这样大幅度提高了InnoDB的并发度。在内部实现中,与Postgres在数据行上实现多版本不同,InnoDB是在undolog中实现的,通过undolog可以找回数据的历史版本。找回的数据历史版本可以提供给用户读(按照隔离级别的定义,有些读请求只能看到比较老的数据版本),也可以在回滚的时候覆盖数据页上的数据。在InnoDB内部中,会记录一个全局的活跃读写事务数组,其主要用来判断事务的可见性。
这边主要的两个组成是:

a.readview 全局的事务视图来判断可见性
b.undo日志,用于记录数据的变化

MVCC详解

1.实现原理

MVCC在默认的rr隔离级别下,就是对数据库做了一次快照,但是这个快照是记录的全局的事务ID。这个事务id是全局的,而且是递增的。每行记录也有自己的row_trx_id .
每个事务在启动的时候会,会构造一个事务数组,主要是记录这个开启瞬间的事务活跃情况。ID最小的是低水位,最大的值+1是高水位。这个数据其实就是我们所说的readview。
而每行记录会有2或者3个隐藏的字段,手册描述如下

Records in the clustered index contain fields for all user-defined columns. In addition, there is a 6-byte transaction ID field and a 7-byte roll pointer field.
If no primary key was defined for a table, each clustered index record also contains a 6-byte row ID field
  • 1
  • 2

包含一个行的事务ID 和undo的指针,如果是没有主键的表,还会包含row Id。

结构readview 和row_trx_id就可以判断数据对于当前事务的可见性:

在这里插入图片描述

如图所示:
1.如果是< m_up_limit_id,则不可见
2.如果>m_low_limit_id,则可见。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/239612
推荐阅读
相关标签
  

闽ICP备14008679号