ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MySQL-事务

2022-09-10 23:30:09  阅读:216  来源: 互联网

标签:事务 快照 提交 TRX 版本 MySQL ID


ACID

A:automicity 原子性:一个事务的所有操作要么全部完成,要么全部不完成。
C:consistency一致性:事务开始和结束以后,数据库的完整性约束没有被破坏
I:Isolation 隔离性,不同事务互不影响
D: durability 持久性,事务结束后对数据的修改是永久的。

# 显示的开启事务
start transaction 
# 或
begin
# 一些操作
# 自定义保存点
savepoint pointname
# 提交事务
commit 
# 或 
commit work
# 回滚
rollback to point

事务的分类

  1. 扁平事务:最简单的普通的事务
  2. 带保存点的事务
  3. 链式事务
  4. 嵌套事务
  5. 分布式事务

事务的隔离级别

  1. 未提交读,脏读:可以读取其它未提交的事务的修改
  2. 已提交读:必须是已提交的事务的修改才可以看得到但无法解决不可重复读问题
  3. 可重复读:mysql默认,但可能会出现幻读,不可重复读针对的是更新和删除操作,幻读针对的是插入操作
  4. 串行化

事务隔离方案

LBCC

Locked Based Concurrency Control,加锁,不允许其它事务对当前事务读取的数据进行操作。
加锁保证了每次读都是最新的结果,也叫做当前读

MVCC

MultiVersion Concurrency Control, 多版本并发控制。
修改数据时,生成一个快照,后面的事务读取的是这个快照,所以也叫做快照读。

原理

在InnoDb中为了实现MVCC机制,其内部为每一行添加了两个隐藏列DB_TRX_ID(事务ID)和DB_ROLL_PTR:回滚指针。

  1. DB_TRX_ID: 存储插入或更新语句的最后一个事务ID
  2. DB_ROLL_PTR:回滚指针,指向上一个快照,通过这个指针找到之前版本的数据,读取数据的时候会根据指针寻找undo段中的数据。

事务在开启时会申请一个事务ID。InnoDB会在其内部为每个事务构造一个数组,用来保存事务ID。

数据可见性规则

  1. 如果一条数据的事务版本(DR_TRX_ID)是当前事务创建视图之前生成并提交的,就可见。
  2. 如给某数据的事务版本是(DR_TRX_ID)是当前事务创建视图之后才生成的就不可见
  3. 如果查询到的数据事务版本处于黄色区域,a)如果
    这个版本是由未提交的事务生成的不可见,b)如果这个版本是由已提交的事务生成的则可见,即已提交但还未来得及从未提交数组中移除。

即:对于保存在已提交事务数组中的事务id对应的版本是可见的,对但已提交的事务没来得及从未提交数组中移除的事务是可见的。

快照是什么时候产生的

  1. 手动执行 START TRANSACTION WITH CONSISTENT SNAPSHOT时会立即产生快照。
  2. 事务内第一次执行select后产生

标签:事务,快照,提交,TRX,版本,MySQL,ID
来源: https://www.cnblogs.com/baiyutang7/p/16683200.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有