MySQL 事务隔离
创始人
2024-05-31 20:54:07

MySQL 事务隔离

  • 事务隔离实现
  • 事务的启动

ACID : 原子(Atomicity)、一致(Consistency)、隔离(Isolation)、永久(Durability)

  • 多个事务可能出现问题 : 脏读 (dirty read) , 不可重复读 (non-repeatable read) , 幻读 (phantom read)

事务隔离级别 :

  • 读未提交 (read uncommitted) : 事务没提交时,做的变更能被其他事务看到
  • 读提交 (read committed) : 事务提交后,做的变更被其他事务看到
  • 可重复读 (repeatable read) : 与事务启动时 ,看到的数据一致
  • 串行化 (serializable) : 对同一行记录 , 进行读写锁。当读写锁冲突时,后访问的事务要等前个事务执行完成,才能继续执行

隔离级别例子 :

  • 读未提交 : V1 = 2 : 事务 B 还没有提交,但能被 A 看到。V2、V3 = 2
  • 读提交 : V1 = 1,V2 = 2。事务 B 提交后才能被 A看到。 V3 = 2
  • 可重复读 : V1、V2 = 1 : 事务中看到的数据都是一致的。V3 = 2
  • 串行化 : 在事务 B 执行 将 1 改成 2时锁住。直到事务 A 提交后,事务 B 才能执行。V1、V2 =1,V3 = 2

在这里插入图片描述

查看隔离级别 :

show variables like 'transaction_isolation';+-----------------------+----------------+
| Variable_name | Value |
+-----------------------+----------------+
| transaction_isolation | READ-COMMITTED |
+-----------------------+----------------+

事务隔离实现

每条记录在更新时 , 都会记录一条回滚操作

  • 记录上的最新值,通过回滚操作,都能得到前一个状态的值
  • 数据库的多版本并发控制 (MVCC) : 同一条记录在系统中能存在多个版本
  • 当没有事务用到这些回滚日志时 (没有比该回滚日志更早的 read-view ),回滚日志会被删除

在这里插入图片描述

事务的启动

事务启动方式 :

  • 显式启动事务 : beginstart transaction, 提交 : commit , 回滚 : rollback
  • set autocommit=0: 将该线程的自动提交关掉。该事务只有主动执行 commitrollback 或断开连接 才结束

注意点 :

  • 建议用 set autocommit=1, 通过显式启动事务 , 避免意外的长事务
  • 当连续开启事务用 commit work and chain (提交事务并自动启动下个事务) : 省了再次执行 begin 的开销

查询长事务 :

select * 
from information_schema.innodb_trx 
where TIME_TO_SEC(timediff(now(), trx_started)) > 60

相关内容

热门资讯

哪款空调划算 环保用户关注新一... 当夏日蝉鸣渐起,冬夜寒意悄然攀窗,节能环保关注者不再满足于基础冷暖——他们需要真正懂空气、惜能源、护...
2026空调性能排行榜 小空间... 夏日午后的宿舍楼道里,风扇嗡鸣、墙面微烫,而隔壁房间却静得只听见翻书声——那台悄然运行的空调正以近乎...
美股午盘走低道指下挫880点,...   北京时间7月30日凌晨,美股周三午盘继续下跌,道指跌逾880点。美国国债收益率走高。市场静待美联...
谎称认识领导能办理船牌号   本报讯 临高男子王某谎称“认识领导”,以帮助办理船牌号、申请造船指标为名,骗取表哥符某36.1万...
浙江坤博精工股东减持计划届满:... 2026年7月27日,浙江坤博精工科技股份有限公司(以下简称“公司”)发布股东减持股份结果公告,披露...