转载:数据库一致性的理解

ACID:

  - Atomicity: the transaction is either completely or not at all. For this, the beginning of the transaction is marked with the BEGIN command, and the end is either COMMIT (commit changes) or ROLLBACK (undo changes).
  - Consistency: the transaction begins in a consistent state and, completing, also maintains consistency.
  - Isolation: other transactions running at the same time with this one should not affect it.
  - Durability: after the data are recorded, they should not be lost even in case of failure.

一致性是指数据处于一种语义上的有意义且正确的状态。一致性是对数据可见性的约束,保证在一个事务中的多次操作的数据中间状态对其他事务不可见的。因为这些中间状态,是一个过渡状态,与事务的开始状态和事务的结束状态是不一致的。
举个栗子,张三给李四转账100元。事务要做的是从张三账户上减掉100元,李四账户上加上100元。一致性的含义是其他事务要么看到张三还没有给李四转账的状态,要么张三已经成功转账给李四的状态,而对于张三少了100元,李四还没加上100元这个中间状态是不可见的。
那么反驳的声音来了:

1.要么转账操作全部成功,要么全部失败,这是原子性。从例子上看全部成功,那么一致性就是原子性的一部分咯,为什么还要单独说一致性和原子性?
2.你说的不对。在未提交读的隔离级别下是事务内部操作是可见的,这时候会出现脏读,明显违背了一致性,怎么解释?

好吧,你的疑问很有道理,也很充分,这正说明你对事务的ACID特性理解的很到位。不过,需要注意的是:

1.原子性和一致性的的侧重点不同:原子性关注状态,要么全部成功,要么全部失败,不存在部分成功的状态。而一致性关注数据的可见性,中间状态的数据对外部不可见,只有最初状态和最终状态的数据对外可见。
2.在未提交读的隔离级别下,会造成脏读,这就是因为一个事务读到了另一个事务操作内部的数据。ACID中是的一致性描述的是一个最理想的事务应该怎样的,是一个强一致性状态,如果要做到这点,需要使用排它锁把事务排成一队,即Serializable的隔离级别,这样性能就大大降低了。现实是骨感的,所以使用隔离性的不同隔离级别来破坏一致性,来获取更好的性能。

  

猜你喜欢

转载自www.cnblogs.com/jkwll/p/11520989.html