MySQL(6)— 事务
六、事务
ACID: 原子性、一致性、隔离性和持久性
- 原子性(atomicity) :一组事务,不能再细分了,其中的sql, 要么全部提交成功,要么全部失败回滚,不能只提交其中的一部分操作。
- 一致性(consistency) :一组事务里面的数据总量,总是一致的,不会凭空增加或减少。
- 隔离性(isolation) :两组事务执行时,各自独立,互不影响!
- 持久性(durability) :事务一旦提交,数据更改将持久化的存储到数据库文件中,不会因为外界物理因素而改变。
隔离性可能导致的问题:
-
脏读:指一个事务读取了另外一个事务未提交的数据。
-
不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同。(场合: 修改)
同样的条件, 你读取过的数据, 再次读取出来发现值不一样了
-
幻读: 是指在一个事务内读取到了别的事务增删后的数据,导致前后读取不一致。
(场合: 新增 或者 删除 。)
同样的条件, 第1次和第2次读出来的记录数不一样
参考博客 : https://blog.csdn.net/dengjili/article/details/82468576
精炼解释:
-
不可重复读的重点是修改:
同样的条件, 你读取过的数据, 再次读取出来发现值不一样了
-
幻读的重点在于 新增或者删除
同样的条件, 第1次和第2次读出来的记录数不一样
当然, 从总的结果来看, 似乎两者都表现为两次读取的结果不一致.
但如果你从控制的角度来看, 两者的区别就比较大
- 对于前者, 只需要锁住满足条件的记录
- 对于后者, 要锁住满足条件及其相近的记录
参考博客:https://blog.csdn.net/jdnicky/article/details/91493719
事务执行流程
sql 中具体语法结构:
- 关闭默认设置的事务自动提交
- 开启一个事务
- 编写sql
- 提交 (commit) 或者 回滚 (rollback)
- 恢复默认设置的事务自动提交
set autocommit = 0 -- 关闭事务自动提交
start transaction -- 开启一个事务
update account set money = money - 500 where name = 'A' -- A给B转账500,A账户减500
update account set money = money + 500 where name = 'B' -- B收到转账500,B账户加500
conmiit; -- 提交事务,数据持久化
rollback; -- 回滚到未提交事务前的状态
set autocommit = 1 -- 恢复事务自动提交
浙公网安备 33010602011771号