事务隔离性和隔离级别
# 事务隔离性和隔离级别
# ACID
事务的四大特性:
原子性(Atomicity):事务作为⼀个整体被执⾏,包含在其中的对数据库的操作要么全部被执⾏,要么都不执⾏。
一致性(Consistency):指在事务开始之前和事务结束以后,数据不会被破坏,假如 A 账户给 B 账户转 10 块钱,不管成功与否,A 和 B 的总⾦额是不变的。
隔离性(Isolation):多个事务并发访问时,事务之间是相互隔离的,即⼀个事务不影响其它事务运⾏
效果。
持久性(Durability):表⽰事务完成以后,该事务对数据库所作的操作更改,将持久地保存在数据库之中。
# ACID 靠什么保证
- 隔离性:通过数据库锁的机制实现。
- 一致性:由 undo log 来保证。undo log 是回滚日志,记录了事务的 insert、update、delete 操作,回滚的时候做相反的 delete、update、insert 操作来恢复数据。
- 原子性和持久性:由 redo log 来保证。redo log 重做日志是物理日志,事务提交的时候,必须先将事务的所有日志写入 redo log 持久性,到事务的提交操作才算完成。
# 幻读,脏读,不可重复读
- 脏读:事务 A、B 交替执⾏,事务 A 读取到事务 B 未提交的数据
- 不可重复读:在⼀个事务范围内,两个相同的查询,读取同⼀条记录,却返回了不同的数据,这就是不可重复读
- 幻读:事务 A 查询⼀个范围的结果集,另⼀个并发事务 B 往这个范围中插⼊ / 删除了数据,并静悄悄地提交,然后事务 A 再次查询相同的范围,两次读取得到的结果集不⼀样了,这就是幻读。
# 隔离级别
- 未提交读(Read Uncommitted):一个事务还没提交时,它做的变更就能被别的事务看到。
- 以提交读(Read Committed):一个事务提交之后,它做的变更才会被其他事务看到。
- 可重复读(Repeatable Read):一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。
- 序列化(Serializable):顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。
隔离得越严实,效率就会越低。不同隔离级别对应会产生的问题:
隔离级别 | 脏读 | 不可重复读 | 幻读 | 加锁读 |
---|---|---|---|---|
未提交读(Read Uncommitted) | Yes | Yes | Yes | No |
已提交读(Read Committed) | No | Yes | Yes | No |
可重复读(Repeatable Read) | No | No | Yes(InnoDB 除外) | No |
序列化/串行(Serializable) | No | No | No | Yes |
获取当前事务隔离级别,默认是 RR (可重复读)
# 默认是 REPEATABLE-READ SHOW VARIABLES LIKE 'transaction_isolation';
1
2设置当前会话事务隔离级别
# 设置为“读未提交” SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; # 设置为“读已提交” SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; # 设置为“可重复读” SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; # 设置为“序列化” SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
1
2
3
4
5
6
7
8
# 参考
评论
上次更新: 2024/05/29, 14:25:22