事务
1. 事务
1.1 概述
事务可由一条非常简单的SQL
语句组成,也可以由一组复杂的SQL
组成。
事务是访问并更新数据库中各种数据项的一个程序执行单元。
事务中的操作,要么全部成功,要么全都不成功。
事务必须同时满足四个特性:原子性、一致性、隔离性、持久性。
1.1.1 A(Atomicity)原子性
原子性指整个数据库事务是不可分割的工作单位。只有使事务中所有的数据库操作都执行成功,才算整个事务成功。事务中任何一个SQL
语句执行失败,已经执行成功的SQL
必须撤销,数据库状态应该退回到事务前的状态。
以银行取钱为例:
1)登录 ATM 机平台,输入密码
2)从银行的数据库中,取得账户的信息
3)用户在ATM机上输入要提取的金额
4)更新银行数据库中的账户信息
5)ATM 出款
6)用户取钱
整个取款过程应该被视为原子操作,即要么全做,要么全不做。不能用户钱未从 ATM 机取得,银行卡上的钱已经被扣除。
1.1.2 C(Consistency)一致性
一致性指事务将数据库从一种状态转变为下一种一致的状态。在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
例如表中一个字段具有唯一约束,如果一个事务对该字段进行修改,但是在事务提交或事务操作发生回滚后,该字段的数据不唯一了,这就破坏了事务的一致性要求,即事务将数据库从一种状态变为了一种不一致的状态。
事务是一致性的状态,如果事务中某个动作失败了,系统可以自动撤销事务 — 返回初始化的状态。
1.1.3 I(Isolation)隔离性
事务隔离性要求每个读写事务的对象对其他事务的操作对象能相互分离,即该事务提交前对其他事务都不可见,通常使用锁来实现。
1.1.4 D(Durability)持久性
事务一旦提交,其结果就是永久性的。即使发生宕机等故障也能恢复。
1.2 分类
1.2.1 扁平事务
在扁平事务中,所有操作都处于同一层次,其由 BEGIN WORK
开始,由 COMMIT WORK
或 ROLLBACK WORK
结束,其间的操作是原子的,要么都执行,要么都回滚。
扁平事务的主要限制是不能提交或者回滚事务的某一部分,或分几个步骤提交。