在我刚开始学习数据库事务时,一直就晕晕呼呼的,今天总结下。 主要回顾以下几个方面:
- Mysql事务:事务的概念,事务实现原理,4大特性,3大并发问题,4大隔离级别,只读事务;
- Jdbc事务: Jdbc的事务API;
- Mybatis事务: Mybatis的事务管理机制;
- Spring事务: 声明式/编程式事务,4种隔离级别, 7种传播行为,嵌套事务,平台事务管理器;
- 分布式事务: 刚性事务,2pc(两阶段提交),3pc(三阶段提交);tcc柔性事务,base理论,cap理论。
0. 何为事务
一组逻辑操作单元,使数据从一种状态变换为另一种状态。这句话有两个重点: 1. 一组,说明事务应该是多个操作, 2. 一种状态变换为另一种状态,说明单元具有整体一致性
1. 应用场景
- 转账: 最直接的例子,双方要么都成功,要么都失败;
- 删除用户及其附属信息: 要么整个删除成功,要么整个删除失败;
- 操作日志: 操作记录必有日志,有日志必有操作记录,不能分离。
2. 事务管理DML语句
D(Data) M(Manipulation) L(Language)数据操纵语言,也就是insert,update,delete这三种语句。
3. 哪种存储引擎支持事务
InnoDB支持,MyISAM不支持。
4. 事务4大特性:ACID
-
原子性(Atomicity,或称不可分割性):一个事务必须被视为一个不可分割的最小单元,整个事务中的所有操作要么全部提交成功,要么全部失败,对于一个事务来说,不可能只执行其中的一部分操作。
-
一致性(Consistency):事务将数据库从一种一致性转换到另外一种一致性状态,在事务开始之前和事务结束之后数据库中数据的完整性没有被破坏。
-
隔离性(Isolation,又称独立性):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
-
持久性(Durability):一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,已经提交的修改数据也不会丢失。
5. 注意点
在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。
6. 事务控制语句
-
BEGIN 或 START TRANSACTION, 显式地开启一个事务;
-
COMMIT 或 COMMIT WORK,提交事务。COMMIT会对数据库进行的所有修改成为永久性的;
-
ROLLBACK 或 ROLLBACK WORK,回滚事务。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
-
SAVEPOINT savepoint_name,SAVEPOINT 允许在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT;
-
RELEASE SAVEPOINT savepoint_name, 删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;
-
ROLLBACK TO savepoint_name, 把事务回滚到标记点;
-
SET TRANSACTION, 用来设置事务的隔离级别。InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED(读未提交/RU)、READ COMMITTED(读已提交/RC)、REPEATABLE READ(可重复读/RR) 和 SERIALIZABLE(串行化/SZ)。
-
SET AUTOCOMMIT=0, 设置Mysql禁止自动提交事务
-
SET AUTOCOMMIT=1, 设置Mysql开启自动提交事务
-
SAVEPOINT 是在数据库事务处理中实现“子事务”(subTransaction),也称为嵌套事务的方法。事务可以回滚到 savepoint 而不影响 savepoint 创建前的变化, 不需要放弃整个事务。ROLLBACK 回滚的用法可以设置保留点 SAVEPOINT,执行多条操作时,回滚到想要的那条语句之前。