“事务”的介绍

事务(Transaction) 可以将一系列数据库操作绑定在一起执行,要么一起成功,要么都不执行。

设想假如我去银行取钱,我的账户余额扣除了1000元,但是这个时候ATM机坏了,什么都没有吐出来,此时我的钱就凭空消失了。如果把“从账户里扣除1000元”和“ATM吐出1000元”绑定成一个 事务 ,就可以避免这种情况的发生,如果ATM吐钱失败了,我的账户也不会扣钱。

还有一种情况,是David教授在CS50的课上举的例子,假如宿舍里有一个小冰箱,一天我打开冰箱发现牛奶喝完了,于是我去买牛奶,这时我的室友回来了,他也看到冰箱里没牛奶了,于是也去买。结果两个人都买了牛奶,冰箱放不下了。

买牛奶这个问题的关键在于,我的室友并不知道冰箱有没有牛奶的状态正在从“没有”更新到“有”,他只能看到冰箱里“没有”牛奶,而不知道我已经去买牛奶了。具体到数据库上,我们需要一种方法,把数据库“锁住”,让其他读取操作等待,直到数据更新完毕后再执行。

“取钱”和“买牛奶”这两个问题都可以通过SQL中的“事务”来解决,你只需要把一系列的命令用BEGIN TRANSACTIONCOMMIT包裹起来就可以了。

1
2
3
BEGIN TRANSACTION
......
COMMIT

四大特性

事务具有ACID四大特性:

  1. 原子性(Atomicity):事务中的操作不可再分,要么全部成功,要么全部取消。
  2. 一致性(Consistency):事务开始前与结束后的数据都是合法的,例如甲给乙转账,转账前后他们俩的钱加起来应该不变。
  3. 隔离性(Isolation):事务的运行互不干扰。
  4. 持久性(Durability):事务完成后,它对数据库的修改就永久提交了,不再回滚。

本文属于系列文章:SQL学习笔记