1 介绍
具有基本知识的DBA都知道,PostgreSQL在控制数据的一致性是通过使用一种多版本模型来维护的,也就是常说的多版本并发控制MVCC。这也就意味着每一个sql语句看到的都只是一小段时间的数据库快照,或者称为版本,而并不关心底层的数据文件当中的当前状态。这样带来的好处就是保护每一个会话中的事务不受到其他会话的影响,提供了非常好的事务隔离机制。MVCC并发控制模型相对于锁机制的优点在于,查询数据的锁请求与写数据的锁请求并不冲突,所以,读不会阻塞写,写也不会阻塞读。
2 事务隔离
其实说起事务隔离,可能偏向于理论上一些,但是对于数DBA人员来说,这个需要牢牢掌握,因为很多时候在排查异常问题的时候,需要分析每一个sql、每一个事务都对数据库进行了哪些操作,为什么会导致数据不一致的原因等等。
sql标准定义了四种隔离级别:读未提交、读已提交、读可重复、可序列化。四种关系层层递进,越来越严格。
读未提交 Read uncommitted
解释就是一个事务读到了另一个事务未提交的数据,一旦另一个事务回滚了,那么读到的数据就是有问题的。这种现象就是脏读了。
读已提交 Read committed
读已经提交的数据能够解决脏读的问题,因为这个事务需要等待另一个事务提交后才能读取数据。但是该级别有一个问题,重复读的时候可能会产生不同的数据,这是因为该事务读取的两次过程中,这些数据并没有锁住 ,还是可以处于能够修改(update和delete)的。该级别是postgresql默认的级别。
读可重复 Repeatable read
该级别解决了读已提交的不可重复读的问题,在事务开启的时候&