PostgreSQL中的SSL
PGSQL数据库的默认隔离级别是读提交,并且同时支持可重复读和序列化模式。但是在9.1之前的版本中,序列化模式等价于快照隔离,并非是真正的序列化模式。
这样的话就会存在一个问题,那就是写偏序(Write Skew)问题。因此在PGSQL中引入了Serializable Snapshot Isolation(SSL)方法解决。
- Serializable Snapshot Isolation
在主流的数据库中,并发控制一般采用S2PL或者MVCC实现。写偏序异常在这两种并发控制下有不同的表现:1.在S2PL情况下,当操作序列中含有写操作时,会阻塞其他事物的读和写,因此不会有并发的读写操作,这样可以避免写偏序异常。2.当MVCC保留元组的多个版本的操作中,实现了读和写互不阻塞,只有写和写互相冲突。这种性质导致了可能会有并发的读写操作,因此会产生写偏序异常,进而导致事务的不可串行化。
在事务调度时,会根据读写操作是否冲突调整并发事务之间读写操作的执行顺序。假设有两个事务序列:
T1:R1(X)W1(Y)
T2:R2(Y)W2(X)
在可串行化调度下,这两个事务中的会产生两个冲突:R1(x)和W2(x)冲突,W1(y)和R2(y)冲突。这样就产生了顺序依赖,无法进行可串行化调度。