日期:2014-05-16  浏览次数:20710 次

数据库事务与隔离事例

?

大家都知道,数据 库 事 务 的四大特性 ACID ( Atomic, Consistency, Isolation, Durability ), 这 里主要考 虑 一致性和隔离性。 为 了提高事 务 的 处 理效率,通常并 发 的 执 行多个事 务 , 这 就是数据 库 中非常重要的 ‘ 并 发 控制 ’ 。 简单 说 ,并 发 的 执 行事 务 ,会有以下 问题 :

  • 写 丢 失(Write Lost) :比如事 务 A 将x 的 值 更新 为 10 ,然后事 务 A 将y 的 值 更新 为 20 , 这时 A 重新 读 取x 发现 自己更新 过 的数据似乎不 见 了。
  • 脏读 (Dirty Read) :比如事 务 A 的未提交( 还 依然 缓 存)的数据被事 务 B 读 走,如果事 务 A 失 败 回 滚 ,会 导 致事 务 B 所 读 取的的数据是 错误 的;
  • 不可重复 读 (Non-repeatable Read) :比如事 务 A 中两 处读 取数据 total 的 值 。在第一 读 的 时 候, total 是 100 ,然后事 务 B 就把 total 的数据改成 200 ,事 务 A 再 读 一次, 结 果就 发现 , total 竟然就 变 成 200 了,造成事 务 A 数据混乱。
  • 幻象 (Phantom Read) :和 Non-Repeatable Read 相似,也是同一个事 务 中多次 读 不一致的 问题 。但是 Non-Repeatable Read 的不一致是因 为 他所要取的数据集被改 变 了(比如 total 的数据),但是 Phantom Read 所要 读 的数据的不一致却不是他所要 读 的数据集改 变 ,而是他的条件数据集改 变 。比如 Select account.id where account.name="ppgogo*", 第一次 读 去了 6 个符合条件的 id ,第二次 读 取的 时 候,由于事 务 b 把一个 帐 号的名字由 "dd" 改 成 "ppgogo1" , 结 果取出来了 7 个数据。