什么是事务?
就是一组 sql 语句, 它是不可分割的整体。
一. 事务的 ACID 四大特性
- 原子性(atomitil)
不可分割,要么一起成功,要么一起失败 - 一致性
数据保持一致状态,从一个一致性状态到另一个一致状态,保证数据准确可靠 - 隔离性
事务之间互不干扰(互补干扰的程度由隔离级别决定) - 持久性
数据一旦提交,不可撤回
二. 事务分类
-
隐式事务
没有直接显式声明事务,如:curd 的每个语句,都是一个隐式事务 -
显式事务
明确的用命令开启和关闭事务,手动开启事务过程:
set autocommit = 0;# 关闭自动提交
start transaction;# 开启事务,可以省略
...
savepoint a;
...
# sql 中 commit 和 rollback 只能二选一,可放在代码中判断,决定回滚还是提交
commit;
rollback;
rollback to a; # 和 savepoint 配合,可回滚到指定位置
truncate是不支持回滚的
三. 事务隔离级别
- 多个事务并发处理相同数据的问题
a. 脏读
一个事务读取了另一个事务未提交的数据
b. 不可重复读
多次读取数据不一致,例如A事务读取到数据,期间数据被B事务修改,A事务再次读取时该数据已经被修改,导致两次读取不一致
c. 幻读
A事务读取了数据,期间B事务插入/删除了部分数据,A事务再次读取时,会发现多出或少了数据
- 事务隔离级别
a. read uncommited
上述三种问题都会有
b. read commited
可避免脏读
c. repeatable read
可避免不可重复读的问题,在 a 事务读取了 t1 表的数据,且 a 事务尚未结束,此时 b 事务提交了修改内容,a 事务再次读取到的数据仍然是修改前的,保证可以重复读数据。
d. Serializable
序列化,串行化上述问题都可避免
mysql 支持上述四种隔离级别,默认隔离级别是 c,oracle 只支持其中的 b、c 两种,默认隔离级别是 b
- 查询和修改隔离级别 (mysql 8)
a. 查询隔离级别:
select @@transaction_isolation;
或
show variables like 'transaction_isolation';
b. 修改隔离级别:
SET GLOBAL | SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
session 只修改本次会话,global 修改全局
网友评论