事务快照行为对比测试

snapshot vs RR

RR隔离级别属于正式规定的四种隔离级别中的一种,SS属于一种衍生的隔离级别。

两者均通过MVCC实现快照读,读不上锁,写上锁。

两者的区别是在出现冲突写的情况时:

  1. RR只会阻塞冲突写,待一方事务结束(commit或rollback),等待的事务继续执行。
  2. SS会阻塞冲突写,持有锁的事务COMMIT提交后,等待的事务必须回滚。

SS隔离级别更高。

准备数据

1
2
3
create database test;
create table test.t1(c1 int);
insert into t1 values(1);

针对mysql、pg、cockroachdb进行行为测试。

测试用例

step trx1 trx2
1 begin; begin;
2 update t1 set c1=100 where c1 =1
3 update t1 set c1=200 where c1 =1
4 commit;
5 commit;
6 select * from t1

测试结果

所有的trx2:step3都会被阻塞。

mysql和pg行为一致,最后c1的值为200.

cockroachdb会回滚trx2,最后为100

1
2
root@:26257/test OPEN> commit;
pq: restart transaction: HandledRetryableTxnError: TransactionRetryError: retry txn (RETRY_WRITE_TOO_OLD): "sql txn" id=21c77f2d key=/Table/51/1/282625409419902977/0 rw=true pri=0.02703415 iso=SNAPSHOT stat=PENDING epo=0 ts=1506321077.996153908,2 orig=1506321070.372553259,0 max=1506321070.372553259,0 wto=false rop=false seq=5

测试脚本

cockroachdb

1
BEGIN TRANSACTION ISOLATION LEVEL SNAPSHOT;

mysql

1
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

pg

1
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

参考链接

*trx isolation
*snapshot isolation

本文标题:事务快照行为对比测试

文章作者:Louis

发布时间:2017年09月25日 - 14:09

最后更新:2017年10月19日 - 15:10

原始链接:/2017/09/25/trx-test/

许可协议: Louis-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。