什么是数据库事务
数据库事务是对各种数据项进行访问和潜在操作的数据库操作序列,必须要么全部执行,要么全部不执行,在逻辑上构成一个不可分割的工作单元。事务包括从事务开始到事务结束期间执行的所有数据库操作。
并非所有对数据库的操作序列都是数据库事务。事务应该具备四个核心属性,即ACID特性:
- 原子性(Atomicity):事务作为一个原子单元执行,包含的数据库操作要么全部执行成功,要么全部回滚,保证数据的完整性。
- 一致性(Consistency):事务应当确保数据库的状态从一个一致状态转变为另一个一致状态,即在事务执行前后,数据满足完整性约束。
- 隔离性(Isolation):在多个事务并发执行时,每个事务的操作应当与其他事务相互隔离,互不干扰。
- 持久性(Durability):一旦事务提交,对数据库的修改应当永久保存在数据库中,即使系统发生故障也不会丢失。
这些属性共同确保了数据库事务的可靠性、一致性和持续性,从而保证了数据的安全性和稳定性。
通过一个常见的“A账户向B账户汇款”的例子来说明数据库事务如何确保数据的准确性和完整性:
原子性:若在第五步时B账户不可用,必须回滚至事务开始前的状态,确保所有步骤要么全部执行,要么全部不执行。
一致性:转账前后,A和B账户总金额应保持不变,确保数据一致性,不会出现负数余额等异常情况。
隔离性:A向B转账过程中,其他事务对A和B账户的查询不应受到影响,各事务应相互独立。同时,若同时有C向B转账的操作,最终B账户的金额应该是A转给B的金额加上C转给B的金额再加上原有金额。
持久性:一旦成功转账(事务提交),A和B账户金额就会真正发生变化并持久保存至数据库,即数据写入后具有持久性。
更新事务的实际流程
一次InnoDB的update操作是一个涉及多个关键组件的复杂过程,具体步骤如下:
图片
需要注意的是在Binlog和Redo Log的写入过程中,实际上是分为两个阶段进行的,采用了两阶段提交的方式来确保数据一致性。