目录
一、事务的几个特性(ACID)
原子性(Atomicity)
事务的整个操作如原子般不可再分割
一致性(Consistency)
一个事务必须使数据库从一个一致性状态变换到另一个一致性状态。
逻辑上就是结果必须是所期待的正常结果
隔离性(Isolation)
一个事务的执行不能被其他事务干扰
持久性(Durability)
事务一旦提交,对数据的改变应该是永久的
二、事务的操作
隐形事务
事务由mysql 内部自动控制,比如insert、update、delete语句,事务的开启、提交或回滚
查看事务是否开启自动提交
show variables like 'autocommit';
#on为开启自动提交,off为未开启自动提交
设置自动提交
//设置不自动提交事务 1为开启自动提交
set autocommit=0;
显式事务
事务需要手动开启、提交或回滚,由开发者自己控制。
开启事务
start transaction
BEGIN
BEGIN work
提交,回滚
#开启
commit
commit work
#回滚
rollback
rollback work
savepoint关键字
用于回滚部分数据(设置节点,能回滚到对应的节点)
savepoint part1 # 设置节点,part1为节点名
rollback to part1 # 回滚到part1 节点
三、事务中可能出现的问题
更新丢失
两个不同的事务在某一时刻对同一数据进行读取后,先后进行修改。导致第一次操作数据丢失
脏读
一个事务读取到另一个事务未提交的数据
不可重复读
在同一事务中多次读取同一数据返回的结果不同
幻读
在一个事务中,添加一个id为100的数据,另一个事务已经提交了一个一个id为100的数据;在提交时报已有此id,执行查询操作未找到此数据,如同出现幻觉一样
四、事务的隔离级别
事物的隔离级别主要是为了解决多个事务之间数据可见性及数据正确性的问题;MySQL InnoDB 存储引擎的 默认支持的隔离级别是 REPEATABLE-READ(可重读)
隔离级别分为4种:
- 读未提交:READ-UNCOMMITTED
- 读已提交:READ-COMMITTED
- 可重复读:REPEATABLE-READ
- 串行:SERIALIZABLE
查看事务的隔离级别
show variables like 'transaction_isolation';
五、只读事务
表示在事务中只能执行读操作,其他操作报错;相比与读写事务有性能上的优化
1、语法
start transaction read only;
2、作用:如在可重复读中保证读的数据一致性,如分页中分别回去总数和对应的详细信息时,防止显示返回有9条数据,实际数据是10条的情况
六、事务的分类
1、扁平事务
扁平事务 是事务类型中最简单的一种;所有操作都处于同一层次,其由BEGIN WORK开始,由COMMIT WORK或ROLLBACK WORK结束
扁平事务的主要限制是不能提交或者回滚事务的某一部分,或分几个步骤提交。
2. 带有保存点的扁平事务
带有保存点的扁平事务 除了支持扁平事务支持的操作外,通过设置不同的保存点,允许在事务执行过程中回滚同一事务中较早的一个状态
3. 链事务
链事务 可视为保存点模式的一种变种,带有保存点的扁平事务,当发生系统崩溃是,所有的的保存点都将消失,因为其保存点是易失的,这意味着当进行恢复时,事务需要从开始处重新执行,而不能从最近的一个保存点继续执行
链事务的思想是:在提交一个事务时,释放不需要的数据对象,将必要的处理上下文隐式地传给下一个要开始的事务,提交事务操作和开始下一个事务操作 将合并为一个原子操作,这意味着下一个事务将看到上一个事务的结果,就好像一个事务中进行的一样
4. 嵌套事务
嵌套事务 是一个层次结构框架,由一个顶层事务(top-level transaction)控制着各个层次的事务,顶层事务之下嵌套的事务被称为子事务,其控制每一个局部的变换
5. 分布式事务
分布式事务 通常是一个分布式环境下运行的扁平事务,因此需要根据数据所在位置访问网络中的不同节点。
注:
对于InnoDB存储引擎来说,其支持扁平事务,带保存点的事务,链事务,分布式事务。对于嵌套事务,其原生不支持。因此对有并发事务需求的用户来说,MySQL数据库或InnoDB存储引擎就显得无能为力,然而用户仍可以通过带保存点的事务来模拟串行的嵌套事务。
参考:
MySQL中事务的五种分类_mysql 事务类型-CSDN博客