我对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”

最后,还有一种理解是业务上的。 比如一个转账事务给A帐户扣钱之后、往B账户加钱之前的这种临时业务状态,可以称为“不一致的状态”。从这个意义上说,防止其他事务脏读,可以称作防止其他事务看到“不一致的数据”

引用

初始值: 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)

Leave a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.