PostgreSQL中的SSL(2)
PGSQL数据库的默认隔离级别是读提交,并且同时支持可重复读和序列化模式。但是在9.1之前的版本中,序列化模式是采用快照隔离来实现,并非是真正的序列化模式。
这样的话就会存在一个问题,那就是写偏序(Write Skew)问题。因此在PGSQL中引入了Serializable Snapshot Isolation(SSL)方法解决。本文记录有一下SSL和S2PL的学习内容。
- S2PL和SSL
在S2PL中,由于读锁和写锁相互冲突,写锁和写锁也相互冲突,而每个事务中的各个操作又都是串行化执行的,因此事务的执行顺序和读写的依赖关系能够对应起来,不会出现事务之间的读写操作相互依赖的情况。
以RW依赖为例,当事务T1读取X对象时会在X上加读锁,而事务T2要修改X对象时需要在X上加写锁,事务T2需要等待事务T1提交(S2PL保证在事务提交时才会放锁)。也就是说,事务T1一定在事务T2之前提交。这种执行顺序产生的结果和先执行T1再执行T2结果一样。
在S2PL中,可以自然的避免写偏序异常。因为在对上面所述的事务使用S2PL时会产生死锁,此时死锁检测会终止其中一个事务。因此S2PL中可以自然的避免写偏序异常的问题。