事务具有以下四种特征:
-
原子性(Atomicity)
事务包含的所有操作要么全部成功,要么全部失败回滚。
-
一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。 -
隔离性(Isolation)
不同事务并发执行操作相同数据时,每个事务都有各自完整的数据空间,即一个事务内所操作使用的数据与其他并发执行的各事务不互相干扰。
-
持久性(Durability)
一个事务一旦提交,对数据库中数据状态变更应该是永久保存下来,即使发生系统崩溃或宕机,也一定能恢复到事务成功结束时的状态。
下面详细讲讲隔离性,在标准SQL规范中,定义了4个事务隔离级别:
-
Read Uncommitted
读未提交又被称为未授权读取,存在脏读。脏读指一个事务处理过程里读取了另一个未提交的事务中的数据。
-
Read Committed
读已提交又被称为授权读取,只允许读取已被提交的数据,存在不可重复读。不可重复读指在一个事务内多次查询同一数据,由于存在查询间隔,数据被别的事务修改,返回不同数值。
-
Repeatable Read
可重复读,保证在同一事务中多次读取同一个数据得到的值都和事务开始时刻一致,存在幻读。幻读是事务非独立执行时发生的一种现象,如事务A对全表数据修改,同时事务B新增了一条数据并提交,事务A的用户发现表中有未修改的数据(事务B新增的那条),如同产生了幻觉。
-
Serializable
串行化要求事务都被串行执行,即事务只能一个接一个处理,不能并发执行。
如图,有三个事务,事务A负责把某个数据项值从1开始,做加1操作,直到变为10后进行事务提交;事务C和A相似,负责将数据项从10逐一加到20并提交;事务B负责读取该数据项的值,面对四种隔离级别,事务B分别能读到的情况:
-
读未提交:
能读到未提交事务的数据,因此1到20所有中间值都可以读到。