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

相关内容

热门资讯

稳固百亿基本盘!全棉时代筑牢消... 2025年,在国际贸易摩擦加剧、关税壁垒抬升,行业整体压力不减的背景下,稳健医疗(300888.SZ...
伊朗称在霍尔木兹海峡上空击落美... 人民财讯5月7日电,伊朗方面消息称,伊朗防空部队当地时间5日晚在霍尔木兹海峡上空击落了一架美军无人机...
CPO 概念行情火热 产业扩容... 5 月 7 日全球宏观盘面重磅洗牌,美元持续弱势震荡、美股全线冲高刷新历史新高,有色金属迎来强势拉升...
媒体视点 | 从“赚了多少钱”... 当新质生产力积厚成势,成为引领中国经济高质量发展的强大新引擎,中国资本市场的科技叙事逻辑更加清晰和具...
告别传统赏花!在黄浦,这十二座... (来源:上观新闻)2026年的春天,上海的城市公共空间里绽放出一片与众不同的春日胜景。新天地绿地里造...