很久之前写的一篇文章,只是简单的叙述

先回顾一下事务的属性(ACID原则)

原子性 一个事务应该是一个原子操作,要么成功,要么失败,不能存在部分成功部分失败的中间状态。
一致性 事务无论成败不能破坏业务规则,必须是从一个一致性状态到另一个一致性状态。(如转帐:钱的总量不能变化/一致)
隔离性 每个事务必须独立于其它事务执行。
持久性 执行结果的值/状态持久。

 

数据并发操作的三种误读

脏读(Dirty Read)

打开一个”别人”正读写的资源的数据。既能读到未提交的数据。
不可重复读(Nonrepeatable Read)
在一个原子操作中,时间点t1去读取一个值与时间点t2再次读取这个值发生了变化,可以是更新,删除。
幻象读(Phantom Read)
在时间点t1执行一个查询,得到的结果集与在时间点t2执行相同查询的结果集不一样,与不可重复读有点类似,不过不可重复读强调的同一个数据在随时间变化,而幻象读强调的是两次查询[结果集行数]增加。而不是指[数据值]的变化。

根据三种读允许出现的情况,正好可以划分ANSI/ISO SQL规定的四种隔离级别

隔离级别 脏读 不可重复读 幻像读
Read Uncommit(未提交读) 允许 允许 允许
Read Commit(提交读) 禁止 允许 允许
Repeatable Read(可重复读) 禁止 禁止 允许
Serializable(串行读) 禁止 禁止 禁止

阅读全文