事务

概念

其实英文叫Transaction,叫交易,简单直观。
一组指令执行,要么都成功,要么都失败。

例子

转账,A的钱要减少,B的钱要增加,必须同时成功。

ACID原则

A:Atomicity,原子性
C:Consistency,一致性
I:Isolated, 隔离性
D:Durability持久性

原子性

对一个事务,要么都完成,要么都失败。

一致性

一个事务操作前和操作后的状态一致,即如果A和B的总和是1000,那么完成交易以后,总和仍然是1000

隔离性

两个事务同时执行时,应该互相不影响。
image.png

如果隔离失败,就会产生问题。

持久性

事务结束后的数据不会因为外界原因而导致数据丢失。即事务一旦提交就不可逆。

例如,一开始A:800,B:200.
如果操作前(事务没有提交)服务器宕机或者断电,恢复以后仍然是A:800,B:200.

—— 转账200 ——

事务结束后,A:600, B:400
操作后(事务已经提交)服务器宕机或者断电,恢复后仍然是A:600, B:400

隔离失败导致的问题

脏读

指一个事务读取了另一个事务未提交的数据。

不可重复读

即在一个事务内,多次对同一行数据进行读取,得到的读取结果不相同(不一定是错误,只是某些场合不对)

幻读

指一个事务内读取到了别的事务插入的数据,导致前后读取不一致。

执行事务

  1. 先关闭自动提交(Mysql默认开启了自动提交)

    1. SET autocommit = 0
  2. 开启事务

    1. START TRANSACTION
  3. 写我们的事务代码

    1. INSERT ...
    2. INSERT ...
    3. INSERT ...
  4. 提交

    1. COMMIT
  5. 回滚

COMMIT和ROLLBACK只能有一个生效

  1. ROLLBACK
  1. 重新开启自动提交
    1. SET autocommit = 1

    模拟场景

    转账 ``bash SET autocommit = 0; START TRANSACTION UPDATE account SET money = money - 500 WHEREname= 'A' # A减500 UPDATE account SET money = money + 500 WHEREname` = ‘B’ # B加500

COMMIT; # 提交事务,完成了数据的持久化 ROLLBACK; # 回滚

SET autocommit = 1; ```