mysql-事物
其他笔记链接:
mysql-常用cmd命令
mysql-数据库基础
mysql-索引
mysql-sql优化
mysql-事物
事物
四大特性ACID[编辑]
- Atomicity(原子性):一个事务(transaction)中的所有操作,或者全部完成,或者全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。即,事务不可分割、不可约简。
- Consistency(一致性):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等。
- Isolation(隔离性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括未提交读(Read uncommitted)、提交读(read committed)、可重复读(repeatable read)和串行化(Serializable)。
- Durability(持久性):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
脏读、不可重复读、幻读
脏读(读取未提交数据)
时间顺序 | 转账事务 | 取款事务 |
---|---|---|
1 | 开始事务 | |
2 | 开始事务 | |
3 | 查询账户余额为2000元 | |
4 | 取款1000元,余额被更改为1000元 | |
5 | 查询账户余额为1000元(产生脏读) | |
6 | 取款操作发生未知错误,事务回滚,余额变更为2000元 | |
7 | 转入2000元,余额被更改为3000元(脏读的1000+2000) | |
8 | 提交事务 | |
备注 | 按照正确逻辑,此时账户余额应该为4000元 |
不可重复读(前后多次读取,数据内容不一致)
时间顺序 | 事务A | 事务B |
---|---|---|
1 | 开始事物 | |
2 | 第一次查询,小明的年龄为20岁 | |
3 | 开始事务 | |
4 | 其他操作 | |
5 | 更改小明的年龄为30岁 | |
6 | 提交事务 | |
7 | 第二次查询,小明的年龄为30岁 | |
备注 | 按照正确逻辑,事务A前后两次读取到的数据应该一致 |
幻读(前后多次读取,数据总量不一致)
时间顺序 | 事务A | 事务B |
---|---|---|
1 | 开始事物 | |
2 | 第一次查询,数据总量为100条 | |
3 | 开始事务 | |
4 | 其他操作 | |
5 | 新增100条数据 | |
6 | 提交事务 | |
7 | 第二次查询,数据总量为200条 | |
备注 | 按照正确逻辑,事务A前后两次读取到的数据总量应该一致 |
不可重复读和幻读到底有什么区别呢?
(1)不可重复读是读取了其他事务更改的数据,针对update操作
解决:使用行级锁,锁定该行,更改数据操作完成后才释放该锁,这个时候才允许其他事务事务读取。
(2)幻读是读取了其他事务新增的数据,针对insert与delete操作,A事物操作受整张表的影响
解决:使用表级锁,锁定整张表,事务新增删除数据之后才释放该锁,这个时候才允许其他事务读取数据总量。
注意
- 迁移数据先把索引关闭,迁移完再打开