事务基础
存储引擎支持情况
1、查看当前 MySQL 支持事务的存储引擎
SHOW ENGINES;
2、MySQL 中只有 InnoDB 支持事务管理
事务
1、一组逻辑操作单元,使数据从一种状态变换到另一种状态
2、事务处理的原则
(1)保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式
(2)当在一个事务中执行多个操作时,要么所有的事务都被提交,则修改就永久地保存下来;要么数据库管理系统将放弃所作的所有修改,整个事务回滚到最初状态
3、ACID 特性
(1)原子性(atomicity):事务是一个不可分割的工作单位,要么全部提交,要么全部失败回滚
(2)一致性(consistency):事务执行前后,数据从一个合法性状态,变换到另外一个合法性状态,这种状态是语义上的而不是语法上的,跟具体的业务有关
(3)合法的数据状态:满足预定的约束的状态,即这状态是自定义的
(4)隔离性(isolation):一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用数据,对其他并发事务是隔离的,并发执行的各个事务之间不能互相干扰
(5)持久性(durability):一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响
(6)持久性通过事务日志来保证的,日志包括重做日志和回滚日志,当通过事务对数据进行修改时,首先会将数据库的变化信息记录到重做日志中,然后再对数据库中对应的行进行修改,即使数据库系统崩溃,数据库重启后也能找到,没有更新到数据库系统中的重做日志,重新执行,从而使事务具有持久性
(7)原子性是基础,隔离性是手段,一致性是约束条件,持久性是目的
事务状态
1、活动
(1)active
(2)事务对应的数据库操作正在执行过程中时
2、部分提交
(1)partially committed
(2)当事务中的最后一个操作执行完成,但由于操作都在内存中执行,所造成的影响并没有刷新到磁盘时
3、失败
(1)failed
(2)当事务处在活动的或者部分提交的状态时,可能遇到了某些错误(数据库自身的错误、操作系统错误、直接断电等)而无法继续执行,或者人为的停止当前事务的执行
4、中止
(1)aborted
(2)如果事务执行了一部分而变为失败的状态,则需要把已经修改的事务中的操作,还原到事务执行前的状态,即撤销失败事务对当前数据库造成的影响(回滚),当回滚操作执行完毕时,数据库恢复到执行事务之前的状态
5、提交
(1)committed
(2)当一个处在部分提交的状态的事务,将修改过的数据都同步到磁盘上之后
6、状态转换图
显式事务
1、步骤一:显示开启事务,START TRANSACTION 或 BEGIN
BEGIN;
#或
START TRANSACTION;
2、START TRANSACTION 相较于 BEGIN,可以跟随修饰符
(1)READ ONLY:标识当前事务是一个只读事务,属于该事务的数据库操作只能读取数据,而不能修改数据
(2)只读事务中只是不允许修改其他事务也能访问到的表中的数据,对于临时表来说(使用 CREATE TMEPORARY TABLE 创建的表),由于它们只能在当前会话中可见,所以只读事务其实也是可以对临时表进行增、删、改
(3)READ WRITE(默认):标识当前事务是一个读写事务,属于该事务的数据库操作既可以读取数据,也可以修改数据
(4)WITH CONSISTENT SNAPSHOT:启动一致性读
(5)READ ONLY、READ WRITE 用来设置事务访问模式,以只读还是读写的方式来访问数据库中的数据,一个事务的访问模式不能同时既设置为只读,也设置为读写
3、步骤二:一系列事务中的操作:主要是 DML,不含 DDL
4、步骤三:提交事务或中止事务(即回滚事务)
#提交事务,当提交事务后,对数据库的永久性修改
COMMIT;
#回滚事务,即撤销正在进行的所有没有提交的修改
ROLLBACK;
#将事务回滚到某个保存点
ROLLBACK TO 保存点;
5、SAVEPOINT 相关操作
#在事务中创建保存点,方便后续针对保存点进行回滚,一个事物中可以存在多个保存点
SAVEPOINT 保存点名称;
#删除某个保存点
RELEASE SAVEPOINT 保存点名称;
隐式事务
1、autocommit 系统变量,查看是否开启隐式事务
SHOW VARIABLES LIKE 'autocommit';
2、autocommit 默认开启,在此状态下每条 DML 语句都是一个独立的事务
3、关闭这种自动提交
(1)方式一:把系统变量 autocommit 值设置为 OFF
#针对于DML操作是有效的,对DDL操作是无效的
SET autocommit = OFF;
#或
SET autocommit = 0;
(2)方式二:在 autocommit 为 true 情况下,显式使用 START TRANSACTION 或 BEGIN 开启一个事务,在本次事务提交或回滚前,暂时关闭掉 DML 自动提交的功能
4、Oracle 默认不自动提交
隐式提交数据的情况
1、使用数据定义语言,如:CREATE、ALTER、DROP 等
2、隐式使用或修改 mysql 数据库中的表,如:ALTER USER、CREATE USER、DROP USER、GRANT、RENAME USER、REVOKE、SET PASSWORD 等
3、事务控制或关于锁定的语句
(1)在上一个事务还没提交或回滚时,又使用 START TRANSACTION 或 BEGIN 开启另一个事务时
(2)当前 autocommit 为 OFF,手动调为 ON 时
(3)使用 LOCK TABLES、UNLOCK TABLES 等关于锁定的语句
4、加载数据的语句:使用 LOAD DATA 往数据库批量导入数据时
5、MySQL 复制语句:使用 START SLAVE、STOP SLAVE、RESET SLAVE、CHANGE MASTER TO 等语句时
6、其它语句:使用 ANALYZE TABLE、CACHE INDEX、CHECK TABLE、FLUSH、LOAD INDEX INTO CACHE、OPTIAIZE TABLE、REPAIR TABLE、RESET 等语句
事务隔离
1、每个客户端与服务器连接上之后,可以称为一个会话(Session),每个客户端都可以在自己的会话中向服务器发出请求语句,一个请求语句可能是某个事务的一部分,也就是对于服务器来说可能同时处理多个事务
2、不隔离的问题
(1)脏写:A 事务修改 B 事务未提交的修改
(2)脏读:A 事务读取 B 事务未提交的修改
(3)不可重复读:A 事务读取两次数据的过程中,B 事务修改数据,导致 A 读取的数据前后不一
(4)幻读:A 事务读取两次数据的过程中,B 事务添加 / 删除数据,导致 A 读取的数据前后不一
3、事务隔离级别:定义事务之间的隔离程度
MySQL 事务隔离级别 | 脏读 | 不可重复读 | 幻读 | 加锁读 |
读未提交:READ UNCOMMITTED | 可能出现 | 可能出现 | 可能出现 | 不加锁 |
读已提交:READ COMMITTED | 不会出现 | 可能出现 | 可能出现 | 不加锁 |
可重复读:REPEATABLE READ | 不会出现 | 不会出现 | 可能出现 | 不加锁 |
可串行化:SERIALIZABLE | 不会出现 | 不会出现 | 不会出现 | 加锁 |
4、支持标准
(1)Oracle 只支持 READ COMMITTED〈默认)和 SERIALIZABLE
(2)MySQL 支持 4 种隔离级别,但与 SQL 标准规定的各级隔离级别不同,MySQL 在 REPEATABLE READ 下,可以禁止幻读发生
(3)MySQL 默认隔离级别为 REPEATABLE READ
5、查看隔离级别
(1)不限版本
SELECT @@transaction_isolation;
(2)MySQL 5.7.20 版本及之后
SHOW VARIABLES LIKE 'transaction_isolation';
6、设置事务的隔离级别
SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL 隔离级别;
#或
SET [GLOBAL|SESSION] TRANSACTION_ISOLATION = '隔离级别';
(1)使用 GLOBAL,在全局范围影响,当前已经存在的会话无效,只对执行完该语句之后产生的会话起作用
(2)使用 SESSION 关键字,在会话范围影响,对当前会话的所有后续的事务有效,如果在事务之间执行,则对后续的事务有效,该语句可以在已经开启的事务中间执行,但不会影响当前正在执行的事务
(3)如果在服务器启动时,改变事务的默认隔离级别,可以修改启动参数 transaction_isolation
事务的常见分类
1、扁平事务
(1)最简单,在实际生产环境中,使用最频繁的事务
(2)所有操作都处于同一层次,其由 BEGIN WORK 开始,由 COMMIT WORK 或 ROLLBACK WORK 结束,其间的操作是原子的,要么都执行,要么都回滚
(3)扁平事务是应用程序成为原子操作的基本组成模块,每个数据库系统都实现对扁平事务的支持
(4)扁平事务的主要限制是不能提交或者回滚事务的某一部分,或分几个步骤提交
2、扁平事务一般有三种不同的结果
(1)事务成功完成,在平常应用中约占所有事务 96%
(2)应用程序要求停止事务,如应用程序在捕获到异常时会回滚事务,约占事务 3%
(3)外界因素强制终止事务,如连接超时或连接断开,约占所有事务 1%
3、带有保存点的扁平事务
(1)除了支持扁平事务支持的操作外,还允许在事务执行过程中,回滚到同一事务中较早的一个状态
(2)因为某些事务可能在执行过程中出现的错误,并不会导致所有的操作都无效,放弃整个事务不合乎要求,开销太大
(3)隐式设置一个保存点,然而在整个事务中,只有这一个保存点,回滚只能会滚到事务开始时的状态
(4)当发生系统崩溃时,所有的保存点都将消失,这意味着当进行恢复时,事务需要从开始处重新执行,而不能从最近的一个保存点继续执行
4、链事务
(1)一个事务由多个子事务链式组成,它可以被视为保存点模式的一个变种
(2)在提交一个事务时,释放不需要的数据对象,将必要的处理上下文,隐式地传给下一个要开始的事务,前一个子事务的提交操作,和下一个子事务的开始操作,合并成一个原子操作,即下一个事务将看到上一个事务的结果
(3)在提交子事务时,就可以释放不需要的数据对象,而不必等到整个事务完成后才释放
(4)工作方式
5、链事务、带有保存点的扁平事务
(1)保存点:带有保存点的扁平事务,能回滚到任意正确的保存点;链事务中的回滚仅限于当前事务,即只能恢复到最近的一个保存点
(2)锁:链事务执行 COMMIT 后,即释放当前所持有的锁;带有保存点的扁平事务不影响迄今为止所持有的锁
6、嵌套事务
(1)一个层次结构框架,由一个顶层事务(Top-Level Transaction)控制着各个层次的事务
(2)子事务(Subtransaction):顶层事务之下嵌套的事务,子事务本身也可以是嵌套事务
(3)嵌套事务的层次结构可以看成是一棵树
7、分布式事务
(1)在一个分布式环境下运行的扁平事务
(2)需要根据数据所在位置,访问网络中不同节点的数据库资源
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战