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

我对ACID的理解
发现自己对数据库事务ACID的理解其实点模糊。今天参阅了Kroenke的《数据库原理》和其它一些材料后,总结如下:


Atomicity
这个最好理解,不用说

======================================================

Durability
这个有两层意思:
  1.事务一旦完成,改动就被持久化了,数据库重启后,数据还在那 (简直是废话,但正因为像废话,才容易让人迷惑)
  2. 有的DBMS可以在突然断电时根据事务日志什么的修复数据


======================================================

Isolation
如果你问自己“什么叫两个事务有互相隔离,什么叫无互相隔离?”,你就会陷入晕眩。
因为这是个伪问题。隔离性不是有没有的问题,而是高不高的问题。

ANSI定义了4种隔离级别,最低叫脏读,最高叫序列化。 并发事务可能在最低级别上运行,也可能在最高级别上运行。 而即使在最低级别上运行,它们也是事务。

=======================================================

Consistency
这是最难让人迷惑的问题,因为"Consistent"在汉语里其实没有关于它的用法。如果你跟人说“一致”,别人只能想到“两个值相同就叫一致”,但这跟事务的一致性好像没什么联系。。。

在我看来,数据库的一致性是指 事务看到的两个值“总是同一个时间点的值”,也就是说,你在10点钟读记录A,11点钟读记录B,如果读得的B的值是10点钟的B的值,那就是有了一致性;如果读的是11点钟的值,那就可能不一致。

引用

初始值: Ra=100, Rb=50
10点钟执行语句:select R ... where id in (a, b) ,先读到了Ra=100
由于某种原因,11点前本查询暂时卡住了
10点半:另一个事务set Rb = 200 并提交
11点钟本查询才继续执行,并读到了Rb. Rb = ?  如果Rb=200,就是不一致,因为200并不是本查询语句启动时的值(10点钟,50)


上面就是“Statement-Level Read Consistency”,即同一个语句里面读到的所有值都是同一个时间点的值


另外有一种级别的一致性,叫“Transaction-Level Read Consistency”

引用

初始值: Ra=100, Rb=50
本事务10点钟开始,执行语句:select R ... where id = Ra ,先读到了Ra=100
10点半时:另一个事务set Rb = 200 并提交
11点钟时本事务执行语句:select R ... where id = b.  Rb = ?  如果是200,就不一致,因为这已不是本事务启动时的值(10点钟,Rb=50)