跳到主要内容

第一章 事务的基本概念

第一章 事务的基本概念

一、事务的特性

数据库的事务在实现时,会将一次事务中包含的所有操作全部封装成一个不可分割的执行单元,这个单元中的所有操作要么全部执行成功,要么全部执行失败。只要其中任意一个操作执行失败,整个事务就会执行回滚操作

1.原子性

事务的原子性指的是构成事务的所有操作要么全部执行成功,要么全部执行失败,不可能出现部分执行成功,部分执行失败的情况

比如A 向 B 转账 100 元,数据库需要进行两个操作,A 的账户要减少 100 元,B 的账户要增加 100 元,这两个操作要么全部执行成功,要么全部执行失败

2.一致性

事务的一致性指的是在事务执行之前和执行之后,数据始终处于一致的状态

还是上面转账的例子,如果转账完成后,A 的账户没有减少 100 元或者 B 的账户没有增加 100 元,这就是数据处于不一致状态

3.隔离性

事务的隔离性指的是并发执行的两个事务之间互不干扰。也就是说,一个事务在执行过程中不能看到其他事务运行过程的中间状态

还是上面转账的例子,在转账完成之前,其他事务查询 A 的账户或者 B 的账户,余额应该是转账完成之前的余额,而不会查询到 A 的账户减少了 100 元,而 B 的账户还没有增加 100 元的中间状态

4.持久性

事务的持久性指的是事务提交完成后,此事务对数据的更改操作会被持久化到数据库中,并且不会被回滚

二、事务的类型

1.扁平事务

扁平事务是事务操作中最常见,也是最简单的事务。在数据库中,扁平事务通常由 begin 或者 start transaction 字段开始,由 commit 或者 rollback 字段结束。在这之间的所有操作要么全部执行成功,要么全部执行失败(回滚)

扁平事务的痛点在于无法提交或者回滚整个事务中的部分事务,只能把整个事务全部提交或者回滚。为了解决这个问题,带有保存点的扁平事务出现了

2.带有保存点的扁平事务

带有保存点的扁平事务通过在事务内部的某个位置设置保存点(savepoint),达到将当前事务回滚到此位置的目的,示例如下

在MySQL 数据库中,通过如下命令设置事务的保存点

save [savepoint_name]

通过如下命令将当前事务回滚到定义的保存点位置