数据库事务原子性、一致性是怎样实现的?

数据库事务原子性、一致性的实现机制是什么?
关注者
1010
被浏览
30788
首先说对原子性的理解。数据库的理解和操作系统的理解是截然相反的。

数据库的原子性说的其实不是楼上说的那些。数据库的原子性说的是failure atomicity:一个事物要么运行成功,要么完全没有运行。也正如题主所问的(非常贴切!),这东西和一致性直接相关。因为如果一个事务的修改到一半终止掉,那么是不可能保持一致性的!

那么楼上说的是啥呢?楼上说的其实是操作系统对atomic的理解:并发控制。OK为啥这么说,因为操作系统直到现在都没有一个统一的并发控制体系,最常用的并发控制就是:锁。而且,锁在操作系统里是没法和数据进行对应的。所以,在操作系统里,用锁来控制运行的顺序:任何要看到非atomic的操作或者非consistent的线程和Interrupt handler都被锁锁在外面。所以,这是操作系统理解的一致性和原子性。

那么数据库说的一致性和原子性是怎么实现的呢?

一般来说用journaling。

任何的修改都先写在一个journal/log里。当事务提交时,会再写一个叫做commit record的东西。那么想象如下情况:如果断电发生,没有提交的事务完成了一半,这个事务就不会有commit record,那么在恢复的时候就会跳过这个事务,就当它没发生;如果提交的事务完成了,那么你一定会看到一个commit record,这时候你就可以根据journal里的数据来恢复你数据库的内容了,这时候,这个事务完整提交。

还有一个叫做copy on write/shadow paging的方法,一般不在数据库中用。因为数据库往往希望对连续读做优化。(但谁知道以后呢…)

PS 数据库的并发控制非常统一(isolation),楼上说了用锁做控制是比较传统的做法(2PL)。除此之外,还有著名的MVCC,比较激进的OCC方法等等…