简介
学习开发至今,数据库部分所学知识一直比较零散,今天整理自己的思路时发现清晰了很多,因此对以前的知识做以总结和梳理。
数据库事务四个特性
- 原子性(Atomicity):针对独立事务,该事务要么全部完成,要么全部回滚。
- 一致性(Consistency):针对独立事务,该事务提交后所得数据必须和预期的数据一致,不受故障影响。
- 隔离性(Isolation):针对多个事务并发,不同事务互不影响,独立执行。
- 持久性(Durability):针对独立事务,该事务一旦提交,所提交数据必须可永久存放,不受故障影响。
事务并发产生的问题
注意:产生问题的基础是事务并发,也即是说一下问题都是由多个事务同时操作同一部分资源造成。
- 脏读:事务A开始事务,更新资源Data,原来的值为1,更新Data值为2且未提交事务;此时,事务B开始事务 并读取资源Data,读取的值为2。
问题:B事务读取到了A事务已经更新,但是没有提交的值,此即为脏读。
- 不可重读:事务A开始事务,读取资源Data,值为1;此时,事务B开始事务,并更新Data的值为2,接着事务B提交,事务B结束;紧接着,还未结束的事务A又读取资源Data,此时读取到的Data值为2。
问题:A事务在事务中 ,第一次读取的Data值为1,第二次读取的Data值为B事务修改后的值2,会发现,A事务,在当前事务中两次读取的Data值不一样,此即为不可重读。
- 幻读:事务A开始事务,统计test表中的记录总数值为5(假设Test表中有5条记录);此时,事务B也开始了事务,并新增一条记录(特别注意是新增一条,而不是修改),事务B提交事务并结束;然后还未结束的事务A又统计了一次Test表的记录总数,发现值变为了6,多了一条。
问题:事务A在事务中,第一次统计的记录数为5,第二次统计的记录数为6,同一个事务两次取得的统计值不一样,此即为幻读。
- 第一类丢失更新:
- 第二类丢失更新:
备注:以上问题中的,不可重读和幻读比较容易混淆,不可重读强调的是,A事务读取到B事务更新的数据;而幻读强调的是,A事务读取到了B事务新增的数据。
事务的隔离级别(四种)
为了解决事务并发所产生的问题,数据库管理系统提供了不同的事务隔离级别,不同的隔离级别对应解决不同的事务并发问题。如下:
隔离级别 | 脏读(Dirty Read) | 不可重复读(NonRepeatable Read) | 幻读(Phantom Read) |
---|---|---|---|
未提交读(Read uncommitted) | 可能 | 可能 | 可能 |
已提交读(Read committed) | 不可能 | 可能 | 可能 |
可重复读(Repeatable read) | 不可能 | 不可能 | 可能 |
可串行化(Serializable ) | 不可能 | 不可能 | 不可能 |
数据库锁
为了实现上述的事务隔离级别,数据库管理系统提供了灵活的锁机制。