当前位置:网站首页>mysql45讲之事务隔离:为什么你改了我还看不见?
mysql45讲之事务隔离:为什么你改了我还看不见?
2022-07-18 19:53:00 【lingengy】
事务的一些基本概念可以从我之前写的这篇文章看:spring事务管理
一、事务隔离的实现
在MySQL中,实际上每条记录在更新的时候都会同时记录一条回滚操作。记录上的最新值,通过回滚操作,都可以得到前一个状态的值。
假设一个值从1被按顺序改成了2、3、4,在回滚日志里面就会有类似下面的记录。
不同时刻启动的事务会有不同的read-view,同一条记录在系统中可以存在多个版本,就是数据库的多版本并发控制(MVCC)。当某一事务要查看其所在read-view的值时,要从当前值一直回滚到其read-view所在的位置才能得到其事务所在版本的值。
通过这种机制,只要记录read-view所在位置,后面这个值经过了多少次修改都与其无关。
系统会判断当系统里没有比这个回滚日志更早的read-view的时候,就是没有事务再需要用到这些回滚日志了,回滚日志会被删除。
关于为什么尽量不要用长事务
长事务意味着系统里面会存在很老的事务视图。由于这些事务随时可能访问数据库里面的任何数据,所以这个事务提交之前,数据库里面它可能用到的回滚记录都必须保留,这就会导致大量占用存储空间。
除了对回滚段的影响,长事务还占用锁资源,也可能拖垮整个库,这个我们会在后面讲锁的时候展开。
二、事务的启动方式
MySQL的事务启动方式有以下几种:
- 显式启动事务语句, begin 或 start transaction。配套的提交语句是commit,回滚语句是rollback。
- set autocommit=0,这个命令会将这个线程的自动提交关掉。意味着如果你只执行一个select语句,这个事务就启动了,而且并不会自动提交。这个事务持续存在直到你主动执行commit 或 rollback 语句,或者断开连接。
有些客户端连接框架会默认连接成功后先执行一个set autocommit=0的命令。这就导致接下来的查询都在事务中,如果是长连接,就导致了意外的长事务。
因此,我会建议你总是使用set autocommit=1, 通过显式语句的方式来启动事务。
但是有的开发同学会纠结“多一次交互”的问题。对于一个需要频繁使用事务的业务,第二种方式每个事务在开始时都不需要主动执行一次 “begin”,减少了语句的交互次数。如果你也有这个顾虑,我建议你使用commit work and chain语法。
在autocommit为1的情况下,用begin显式启动的事务,如果执行commit则提交事务。如果执行 commit work and chain,则是提交事务并自动启动下一个事务,这样也省去了再次执行begin语句的开销。同时带来的好处是从程序开发的角度明确地知道每个语句是否处于事务中。
你可以在information_schema库的innodb_trx这个表中查询长事务,比如下面这个语句,用于查找持续时间超过60s的事务。
select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60
边栏推荐
- 什么是KVM?什么是KVM虚拟机?
- PyCharm配置Anaconda虚拟环境及Conda常用命令介绍
- 若依开源框架介绍
- Event, event type, event object, element box model [DOM (III)]
- Oracle去年和今年的周数,并且附带开始时间与结束时间
- Optaplanner learning notes (VIII) calculate score
- 面对反弹行情,我们如何操作?2020-03-21
- Ubantu topic 3: setting system language and installing Sogou input method
- 牛客网:两个有序数组间相加和的Topk问题
- 嵌入式分享合集15
猜你喜欢
配置网络参数
Boundless Shifu IOT open source development framework helps accelerate the development of Internet of things applications ten times
2022年3月电子学会图形化四级编程题解析含答案:早餐组合
Distributed storage Minio environment construction
边无际 Shifu IoT 开源开发框架 助力物联网应用开发加速十倍
Thread pool, who am I? Where am I?
手持振弦VH501TC采集仪的激励方法和激励电压
嵌入式分享合集15
Optaplanner study notes (11) check scores: which constraints have been broken
leetcode:741. 摘樱桃
随机推荐
Intranet penetration - Metasploit - basic post penetration command
Optaplanner learning notes (VI) using solver solver
OpenSSL筆記-PKCS#1和PKCS#8的區別及分別調用的API
Cdga | how to build data asset catalogue?
骁龙7系芯片是新一代神U?Reno8 Pro次旗舰也能打
In the summer dehumidification battle, Hisense central air conditioning has the ultimate coup
Qt信号和槽
QT signal and slot
Comparable接口
年龄是个硬门槛!42岁,腾讯13级,985硕士,找工作三个月,居然没有一家公司接收!
In March, 2022, the graphical three-level programming problem analysis of the electronic society, including the answer: Catch Game
(cf补题+思维)Codeforces Round #808 (Div. 2)A--C
知识体系:如何构建自己的知识体系
AcWing 378. Knight placement problem solution (maximum independent set =n- minimum point coverage =n- maximum edge matching)
03.线性代数知识
La puce de la série 7 de Hualong est une nouvelle génération de Dieu u? Reno 8 pro subflagship peut également jouer
IP第十天笔记 - - - BGP
清华架构大牛剖析高并发与多线程的关系、区别,带你击穿面试难题
Financial statement modeling - income statement
机器学习数学本质的理解