事务基础

存储引擎支持情况

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、状态转换图

image-20220607112339750

 

显式事务

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)工作方式

image-20220607170323917

5、链事务、带有保存点的扁平事务

(1)保存点:带有保存点的扁平事务,能回滚到任意正确的保存点;链事务中的回滚仅限于当前事务,即只能恢复到最近的一个保存点

(2)锁:链事务执行 COMMIT 后,即释放当前所持有的锁;带有保存点的扁平事务不影响迄今为止所持有的锁

6、嵌套事务

(1)一个层次结构框架,由一个顶层事务(Top-Level Transaction)控制着各个层次的事务

(2)子事务(Subtransaction):顶层事务之下嵌套的事务,子事务本身也可以是嵌套事务

(3)嵌套事务的层次结构可以看成是一棵树

7、分布式事务

(1)在一个分布式环境下运行的扁平事务

(2)需要根据数据所在位置,访问网络中不同节点的数据库资源

posted @   半条咸鱼  阅读(53)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示