什么是数据库事务?更新事务实现流程是怎样的

数据库 其他数据库
数据库事务是对各种数据项进行访问和潜在操作的数据库操作序列,必须要么全部执行,要么全部不执行,在逻辑上构成一个不可分割的工作单元。事务包括从事务开始到事务结束期间执行的所有数据库操作。

什么是数据库事务

数据库事务是对各种数据项进行访问和潜在操作的数据库操作序列,必须要么全部执行,要么全部不执行,在逻辑上构成一个不可分割的工作单元。事务包括从事务开始到事务结束期间执行的所有数据库操作。

并非所有对数据库的操作序列都是数据库事务。事务应该具备四个核心属性,即ACID特性:

  • 原子性(Atomicity):事务作为一个原子单元执行,包含的数据库操作要么全部执行成功,要么全部回滚,保证数据的完整性。
  • 一致性(Consistency):事务应当确保数据库的状态从一个一致状态转变为另一个一致状态,即在事务执行前后,数据满足完整性约束。
  • 隔离性(Isolation):在多个事务并发执行时,每个事务的操作应当与其他事务相互隔离,互不干扰。
  • 持久性(Durability):一旦事务提交,对数据库的修改应当永久保存在数据库中,即使系统发生故障也不会丢失。

这些属性共同确保了数据库事务的可靠性、一致性和持续性,从而保证了数据的安全性和稳定性。

通过一个常见的“A账户向B账户汇款”的例子来说明数据库事务如何确保数据的准确性和完整性:

  1. 读取A账户余额(500)。
  2. 扣除A账户金额(500-100)。
  3. 更新A账户余额(400)。
  4. 读取B账户余额(500)。
  5. 向B账户加款(500+100)。
  6. 更新B账户余额(600)。

原子性:若在第五步时B账户不可用,必须回滚至事务开始前的状态,确保所有步骤要么全部执行,要么全部不执行。

一致性:转账前后,A和B账户总金额应保持不变,确保数据一致性,不会出现负数余额等异常情况。

隔离性:A向B转账过程中,其他事务对A和B账户的查询不应受到影响,各事务应相互独立。同时,若同时有C向B转账的操作,最终B账户的金额应该是A转给B的金额加上C转给B的金额再加上原有金额。

持久性:一旦成功转账(事务提交),A和B账户金额就会真正发生变化并持久保存至数据库,即数据写入后具有持久性。

更新事务的实际流程

一次InnoDB的update操作是一个涉及多个关键组件的复杂过程,具体步骤如下:

  1. Buffer Pool缓存数据读取:首先检查记录是否在内存中,若不在,则从磁盘读取相关页到Buffer Pool中。
  2. 记录Undo Log:在进行修改之前,InnoDB会将修改前的数据记录在Undo Log中。Undo Log的作用在于确保事务的原子性和一致性,以便在需要时将操作回滚到修改前的状态。
  3. 更新Buffer Pool:执行update语句时,InnoDB先更新Buffer Pool中的数据,标记数据页为“脏页”(Dirty Page),表示已修改但尚未写入磁盘。
  4. 记录Redo Log Buffer:同时,InnoDB将修改操作记录在Redo Log Buffer中,确保持久性。
  5. 提交事务:完成所有修改后,事务提交。InnoDB将Redo Log写入磁盘,以保证事务的持久性。
  6. 写入磁盘:事务提交后,InnoDB将Buffer Pool中的脏页异步写入磁盘,确保数据持久存储。这个写入过程具有一定延迟,由后台线程异步执行。
  7. 记录Binlog:在提交时,InnoDB将事务信息记录到Binlog中。Binlog用于主从复制,记录事务相关信息,包括时间戳、数据库名、表名、事务ID和SQL语句等,用于在从库上同步主库的操作。

图片图片

需要注意的是在Binlog和Redo Log的写入过程中,实际上是分为两个阶段进行的,采用了两阶段提交的方式来确保数据一致性。


责任编辑:武晓燕 来源: 码上遇见你
相关推荐

2020-07-17 08:07:54

Spring数据库事务

2020-11-18 08:32:07

数据库

2020-11-18 10:16:52

数据库回滚事务

2024-04-08 10:11:15

MYSQL数据库事务

2010-07-05 17:41:37

SQL Server

2017-08-22 17:10:45

数据库MySQL事务模型

2020-06-17 16:56:36

数据库MySQL跨行事务

2009-09-24 14:12:22

Hibernate数据

2010-10-08 09:38:55

Android数据库事

2021-09-07 10:33:42

MySQL事务隔离性

2020-08-19 09:45:29

Spring数据库代码

2010-06-30 17:27:32

SQL Server数

2019-08-19 10:24:33

分布式事务数据库

2023-10-11 08:09:53

事务隔离级别

2018-07-20 11:10:21

数据库事务隔离性

2018-06-15 08:23:55

Key-Value数据库MVCC

2010-09-07 15:20:58

SQL语句事务

2023-05-23 16:25:48

MyBatisSQL数据库

2018-07-17 10:58:45

数据库数据库事务隔离级别

2019-11-19 08:32:26

数据库HLC事务
点赞
收藏

51CTO技术栈公众号