数据库事务是数据库运行中的逻辑工作单位,单个逻辑工作单元所执行的一系列操作,要么都执行,要么都不执行。例如银行取款事务分为2个步骤(1)存折减款(2)提取现金,2个步骤必须同时完成或者都不完成。
数据库事务的四大特性(ACID):
(1) 原子性(Atomicity):
事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据修改操作要么全部执行,要么完全不执行。这种特性称为原子性。
(2)一致性(Consistency) :
事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。这种特性称为事务的一致性。假如数据库的状态满足所有的完整性约束,就说该数据库是一致的。
(3)分离性(Isolation):
分离性指并发的事务是相互隔离的。即一个事务内部的操作及正在操作的数据必须封锁起来,不被其它企图进行修改的事务看到。假如并发交叉执行的事务没有任何控制,操纵相同的共享对象的多个并发事务的执行可能引起异常情况。
(4)持久性(Durability):
持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。即一旦一个事务提交,DBMS保证它对数据库中数据的改变应该是永久性的,即对已提交事务的更新能恢复。持久性通过数据库备份和恢复来保证。
- READ UNCOMMITTED:未提交读
- 事务中的修改,即使没有提交,对其他事务也是可见的
- 产生的问题:脏读。这里假设两个事务并行:
- A事务对某个数值a进行修改
- B事务执行读取该数值a并进行其他修改,依赖于a
- A事务回滚,发生脏读
- READ COMMITTED:提交读
- 一个事务中的修改在其提交之前,对于其他事务都是不可见的
- 产生的问题:不可重复读。这里假设两个事务并行:
- A事务对某个数值a进行读取,进行计算
- B事务对数值a进行修改并提交,该修改对于A变为可见
- A事务再次进行数值a的读取,发生不可重复读
- REPEATABLE READ:可重复读
- 在一个事务的执行过程中,读到的数据一直是事务开始时的数据
- 产生的问题:幻读。这里假设两个事务并行:
- A事务读取某个值a大于1的数据并计算行数
- B事务插入了一行a为1的数据,并提交
- A事务再次读取,发现行数不一致,发生幻读
- SERIALIZABLE:可重复读
- 强制所有事务都并行执行,对于读取的每一行数据都加上锁
引入知乎的一篇好文章: