ACID
A:automicity 原子性:一个事务的所有操作要么全部完成,要么全部不完成。
C:consistency一致性:事务开始和结束以后,数据库的完整性约束没有被破坏
I:Isolation 隔离性,不同事务互不影响
D: durability 持久性,事务结束后对数据的修改是永久的。
# 显示的开启事务
start transaction
# 或
begin
# 一些操作
# 自定义保存点
savepoint pointname
# 提交事务
commit
# 或
commit work
# 回滚
rollback to point
事务的分类
- 扁平事务:最简单的普通的事务
- 带保存点的事务
- 链式事务
- 嵌套事务
- 分布式事务
事务的隔离级别
- 未提交读,脏读:可以读取其它未提交的事务的修改
- 已提交读:必须是已提交的事务的修改才可以看得到但无法解决不可重复读问题
- 可重复读:mysql默认,但可能会出现幻读,不可重复读针对的是更新和删除操作,幻读针对的是插入操作
- 串行化
事务隔离方案
LBCC
Locked Based Concurrency Control,加锁,不允许其它事务对当前事务读取的数据进行操作。
加锁保证了每次读都是最新的结果,也叫做当前读
MVCC
MultiVersion Concurrency Control, 多版本并发控制。
修改数据时,生成一个快照,后面的事务读取的是这个快照,所以也叫做快照读。
原理
在InnoDb中为了实现MVCC机制,其内部为每一行添加了两个隐藏列DB_TRX_ID(事务ID)和DB_ROLL_PTR:回滚指针。
- DB_TRX_ID: 存储插入或更新语句的最后一个事务ID
- DB_ROLL_PTR:回滚指针,指向上一个快照,通过这个指针找到之前版本的数据,读取数据的时候会根据指针寻找undo段中的数据。
事务在开启时会申请一个事务ID。InnoDB会在其内部为每个事务构造一个数组,用来保存事务ID。
数据可见性规则
- 如果一条数据的事务版本(DR_TRX_ID)是当前事务创建视图之前生成并提交的,就可见。
- 如给某数据的事务版本是(DR_TRX_ID)是当前事务创建视图之后才生成的就不可见
- 如果查询到的数据事务版本处于黄色区域,a)如果
这个版本是由未提交的事务生成的不可见,b)如果这个版本是由已提交的事务生成的则可见,即已提交但还未来得及从未提交数组中移除。
即:对于保存在已提交事务数组中的事务id对应的版本是可见的,对但已提交的事务没来得及从未提交数组中移除的事务是可见的。
快照是什么时候产生的
- 手动执行 START TRANSACTION WITH CONSISTENT SNAPSHOT时会立即产生快照。
- 事务内第一次执行select后产生
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/288732.html