1、什么是事务
事务是并发控制的单位,一系列操作组成的工作单元,该工作单元内的操作是不可分割的,也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。
事务的结束有两种,当事务中的所以步骤全部成功执行时,事务提交。如果其中一个步骤失败,将发生回滚操作,撤消撤消之前到事务开始时的所以操作。
2、事务的 ACID
事务具有四个特征:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持续性(Durability)。这四个特性简称为 ACID 特性。
1)原子性(Atomicity)
事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做
2) 一致性(Consistency)
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。
当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。假如数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不一致。
3)隔离性(Isolation)
一个事务的执行不能其它事务干扰。一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
4) 持续性(Durability)
持续性也称永久性,是指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。
在平常的项目开发里数据库操作一般都是并发执行的,即有多个事务并发执行,数据库事务并发带来的问题有:
1、丢失更新:两个事务同时更新一行数据,最后一个事务的更新会覆盖掉第一个事务的更新,从而导致第一个事务更新的数据丢失,这是由于没有加锁造成的;
第一类丢失更新时间片 | 消费事务A | 充值事务B |
---|---|---|
T1 | 开始事务 | |
T2 | 开始事务 | |
T3 | 查询账户余额500元 | |
T4 | 查询余额为500元 | |
T5 | 充值200元,更改余额为700元 | |
T6 | 提交事务 | |
T7 | 消费100元把余额改为400元 | |
T8 | 撤销事务 | |
T9 | 余额恢复为500元 |
时间片 | 消费事务A | 充值事务B |
---|---|---|
T1 | 开始事务 | |
T2 | 开始事务 | |
T3 | 查询账户余额500元 | |
T4 | 查询余额为500元 | |
T5 | 消费100元,更改余额为400元 | |
T6 | 提交事务 | |
T7 | 余额为400元 | 充值200元,更改余额为700元 |
T8 | 提交事务 | |
T9 | 余额为700元 |
2、脏读:一个事务看到了另一个事务未提交的更新数据;当事务读取尚未提交的数据时,就会发生这种情况。
例如事务A正在访问数据,并且对数据进行了修改,更改了一行数据,这种修改还没有提交到数据库中,而事务B在事务A提交更新之前读取了已更新的行,然后使用了这个数据。
如果事务A回滚该更新,则事务B使用的这个数据由于还没有提交,就会被认为是不曾存在的数据,即为脏数据,根据脏数据所做的操作可能是不正确的。
3、 不可重复读:在同一事务中,两次读取同一数据,得到内容不同,也就是有其他事务更改了这些数据;
例如事务A查询一条记录后,事务B更新了事务A查询的记录,并提交了事务,那事务A再次查询上次的记录时,对同一数据查询了两次,得到的结果不同,这称为不可重复读。
4、幻读:一个事务在执行过程中读取到了另一个事务已提交的插入数据;即在第一个事务开始时读取到一批数据,但此后另一个事务又插入了新数据并提交,此时第一个事务又读取这批数据但发现多了一条,即好像发生幻觉一样。