事务
概念
其实英文叫Transaction,叫交易,简单直观。
一组指令执行,要么都成功,要么都失败。
例子
转账,A的钱要减少,B的钱要增加,必须同时成功。
ACID原则
A:Atomicity,原子性
C:Consistency,一致性
I:Isolated, 隔离性
D:Durability持久性
原子性
对一个事务,要么都完成,要么都失败。
一致性
一个事务操作前和操作后的状态一致,即如果A和B的总和是1000,那么完成交易以后,总和仍然是1000
隔离性
两个事务同时执行时,应该互相不影响。
如果隔离失败,就会产生问题。
持久性
事务结束后的数据不会因为外界原因而导致数据丢失。即事务一旦提交就不可逆。
例如,一开始A:800,B:200.
如果操作前(事务没有提交)服务器宕机或者断电,恢复以后仍然是A:800,B:200.
—— 转账200 ——
事务结束后,A:600, B:400
操作后(事务已经提交)服务器宕机或者断电,恢复后仍然是A:600, B:400
隔离失败导致的问题
脏读
不可重复读
即在一个事务内,多次对同一行数据进行读取,得到的读取结果不相同(不一定是错误,只是某些场合不对)
幻读
指一个事务内读取到了别的事务插入的数据,导致前后读取不一致。
执行事务
先关闭自动提交(Mysql默认开启了自动提交)
SET autocommit = 0
开启事务
START TRANSACTION
写我们的事务代码
INSERT ...
INSERT ...
INSERT ...
提交
COMMIT
回滚
COMMIT和ROLLBACK只能有一个生效
ROLLBACK
- 重新开启自动提交
SET autocommit = 1
模拟场景
转账``bash SET autocommit = 0; START TRANSACTION UPDATE account SET money = money - 500 WHERE
name= 'A' # A减500 UPDATE account SET money = money + 500 WHERE
name` = ‘B’ # B加500
COMMIT; # 提交事务,完成了数据的持久化 ROLLBACK; # 回滚
SET autocommit = 1; ```