MySQL中的事务到底是怎么一回事儿

news/2025/3/23 22:41:47/

简单来说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败。在MySQL中,事务支持是在引擎层实现的,但并不是所有的引擎都支持事务,如MyISAM引擎就不支持事务,这也是MyISAM被InnoDB取代的重要原因之一。

提到事务,肯定会想到ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性)

当数据库上有多个事务同时执行的时候,就可能出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)的问题,为了解决这些问题,就有了“隔离级别”的概念。隔离得越严实,效率就会越低,SQL标准的事务隔离级别包括:读未提交(read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(serializable)。

  • 读未提交:一个事务还没有提交时,它做的变更就能被别的事务看到;

  • 读提交:一个事务提交之后,它做的变更才会被其他事务看到;

  • 可重复读:一个事务在执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的,在此级别下,未提交变更对其他事务也是不可见的;

  • 串行化:对于同一行记录,写会加写锁,读会加读锁,当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。

模拟一个场景,来对比一下四种隔离级别对SQL执行结果的影响:

建一张表:create table T(c int) engine=InnoDB;

插入一条数据:insert into T(c) values (1);

参照下图中的时间顺序来执行两个事务,四种隔离级别下V1、V2、V3的值分别是多少?

图片

隔离级别V1V2V3
读未提交222
读提交122
可重复读112
串行化112

在实现上,数据库里面会创建一个视图,访问的时候以视图的逻辑结果为准。在“可重复读”级别下,这个视图是在事务启动时创建的,整个事务存在期间都用这个视图;在“读提交”级别下,这个视图是在每个SQL语句开始执行的时候创建的;在“读未提交”级别下,直接返回记录上的最新值,没有视图的概念,在“串行化”级别下直接用加锁的方式来避免并行访问。

MySQL的默认隔离级别为:可重复读;Oracle的默认隔离级别是:读提交。

可通过执行:show variables like 'transaction_isolation'; 来查看当前的隔离级别。

隔离级别的实现是通过回滚日志来实现的,回滚日志类似下图:

图片

同一条记录在系统中可以存在多个版本,这就是数据库的多版本并发控制(MVCC)。系统会判断当没有事务再需要用到这些回滚日志的时候,也就是系统里没有比这个回滚日志更早的read-view的时候,回滚日志就会被删除。因此,建议尽量不要使用长事务。

显式启动事务的方式:begin或者start transaction,配套的提交语句是commit,回滚语句是rollback。

一般建议将自动提交事务开启,即执行set autocommit=1,当需要使用事务的时候,通过上述显式语句来启动事务。

查找持续时间超过60秒的事务:

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


http://www.ppmy.cn/news/1291545.html

相关文章

931. 下降路径最小和-Python-DP-简单题

Problem: 931. 下降路径最小和 文章目录 思路解题方法复杂度Code 思路 看了一些题解,感觉写的很复杂,其实我的思考很简单,直接在原数组进行修改 解题方法 第一行不变,从第二行开始,能到达当前位置的路径最多只有三条&a…

第十四章 14.2案例:使用KVM命令集管理虚拟机

查看命令帮助 [rootLinux01 ~]# virsh -h—————————————————————————————————————————— 查看KVM的配置文件存放目录〈test01 , xml是虚拟机系统实例的配置文件) [rootLinux01 ~]# ls /etc/libvirt/qemu —————————————…

2012年第一届数学建模国际赛小美赛B题大规模灭绝尚未到来解题全过程文档及程序

2012年第一届数学建模国际赛小美赛 B题 大规模灭绝尚未到来 原题再现: 亚马逊是地球上现存最大的雨林,比地球上任何地方都有更多的野生动物。它位于南美洲大陆的北侧,共有9个国家:巴西、玻利维亚、厄瓜多尔、秘鲁、哥伦比亚、委…

mybatisPlus beforeGetBoundSql和setProperties使用场景介绍及代码示例

beforeGetBoundSql 和 setProperties 都是 InnerInterceptor 接口中定义的默认方法,可以用于自定义拦截器实现。 beforeGetBoundSql 方法会在 MyBatis 获取 BoundSql 对象之前被调用,可以通过该方法来修改或扩展 SQL 语句,例如添加或删除条件…

LinuxShell

一、 新建用户 在Linux上新建一个用户并赋予超级用户权限,建立家目录并设置默认shell为bash,并设置Linux在输入sudo密码时显示星号。请提交全部命令及输出截图(表明完成需求即可)。 1.sudo useradd -m ymhs(用户名) 增加用户 2.su…

搜维尔科技:深入研究工作场所人体工程学中的动作捕捉

创造安全舒适的工作环境对于员工的健康和组织的整体成功至关重要。这就是为什么我们很高兴举办有关“在工作场所人体工程学中利用动作捕捉技术”的网络研讨会。 通过利用动作捕捉的力量,组织可以彻底改变工作场所人体工程学的方法。它使您能够根据客观的运动数据进行…

计算机网络—网络搭建NAT内外网映射

使用Windows Server 2003 网络拓扑 Router 外网:NAT IP 网段 192.168.17.0/24内网:仅主机模式 IP 172.16.29.4 Client1:仅主机模式 IP 172.16.29.2 网关 172.16.29.1 Client2:仅主机模式 IP 172.16.29.3 网关 172.16.29.1…

告别低效!轻松创建在线文档,就用这6款协同办公神器!

在线文档协作工具有哪些? 这些下来,国内外陆续诞生了各式各样的在线文档协作工具,供用户挑选的工具非常多,选择一多,难免犯嘀咕:选哪一款在线文档协作工具好? 不用担心!在这个回答…