前言

毋庸置疑,在实际的生产开发中,数据库事务是一个十分重要的概念,对数据库事务的处理从来都是开发工作的重要部分。出于大二时学院教学内容的限制以及自己的怠惰。考试考完了对这方面的知识就既无温习也没探索,在工作中遇到相关的概念便十分抓瞎。这个帖子也就用作相关知识的收集,也便于回顾。

何为事务

依照习惯,先给出概念的阐述:数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。
事务的概念解释还是相对好理解的,这里搬运一个来自知乎的示例场景:
A账户给B账户转账一个亿(T1),买一块地盖房子。在这种交易的过程中:

  • 如何同时保证上述交易中,A账户总金额减少一个亿,B账户总金额增加一个亿? A
  • A账户如果同时在和C账户交易(T2),如何让这两笔交易互不影响? I
  • 如果交易完成时数据库突然崩溃,如何保证交易数据成功保存在数据库中? D
  • 如何在支持大量交易的同时,保证数据的合法性(没有钱凭空产生或消失) ? C

若要稳定、可靠地完成交易,就必须能够解决上述的四个问题。事务就是为此而诞生,与四个问题对应的即是事务的ACID四大特性:

  • 原子性(Atomicity): 事务要么全部完成,要么全部取消。 如果事务崩溃,状态回到事务之前(事务回滚)。
  • 隔离性(Isolation): 如果2个事务 T1 和 T2 同时运行,事务 T1 和 T2 最终的结果是相同的,不管 T1和T2谁先结束。
  • 持久性(Durability): 一旦事务提交,不管发生什么(崩溃或者出错),数据要保存在数据库中。
  • 一致性(Consistency): 只有合法的数据(依照关系约束和函数约束)才能写入数据库。

ACID

依然参考上述的场景:

  • 原子性,确保不管交易过程中发生了什么意外状况(服务器崩溃、网络中断等),不能出现A账户少了一个亿,但B账户没到帐,或者A账户没变,但B账户却凭空收到一个亿(数据不一致)。A和B账户的金额变动要么同时成功,要么同时失败(保持原状)。
  • 隔离性,如果A在转账1亿给B(T1),同时C又在转账3亿给A(T2),不管T1和T2谁先执行完毕,最终结果必须是A账户增加2亿,而不是3亿,B增加1亿,C减少3亿。
  • 持久性,确保如果 T1 刚刚提交,数据库就发生崩溃,T1执行的结果依然会保持在数据库中。
  • 一致性,确保钱不会在系统内凭空产生或消失, 依赖原子性和隔离性。

参考资料

渔人:深入理解数据库事务

最后修改:2020 年 04 月 26 日 10 : 53 PM