# 現象テスト(dirty read, r/o, serializable)
# rollbackされるかもしれない更新を読む。
# session1のトランザクション種別が同じならば、
# session2のトランザクション種別にかかわらず同じ結果が得られるはずである。

Begin;
BeginTimeSpan;
Initialize;
EndTimeSpan;
InitializeSession "";
Command "create database TESTDB";
TerminateSession;

InitializeSession "TESTDB";
Command "create table T(C int)";
Command "insert into T (C) values (3)";
TerminateSession;

InitializeSession 1 "TESTDB";
InitializeSession 2 "TESTDB";

#rollbackができなくなるのでsession 2のtransactionなしは試さない

Command 1 "start transaction read only, using snapshot, isolation level serializable";
Command 2 "start transaction read write, isolation level read uncommitted";
Command 2 "update T set C=5";
AsyncCommand "sel" 1 "select * from T";
Sleep 100;
Command 2 "rollback";
#↓{3}
GetAsyncResult "sel";
Command 1 "commit";

#戻す
InitializeSession "TESTDB";
Command "update T set C=3";
TerminateSession;

Command 1 "start transaction read only, using snapshot, isolation level serializable";
Command 2 "start transaction read write, isolation level read committed";
Command 2 "update T set C=5";
AsyncCommand "sel" 1 "select * from T";
Sleep 100;
Command 2 "rollback";
#↓{3}
GetAsyncResult "sel";
Command 1 "commit";

#戻す
InitializeSession "TESTDB";
Command "update T set C=3";
TerminateSession;

Command 1 "start transaction read only, using snapshot, isolation level serializable";
Command 2 "start transaction read write, isolation level repeatable read";
Command 2 "update T set C=5";
AsyncCommand "sel" 1 "select * from T";
Sleep 100;
Command 2 "rollback";
#↓{3}
GetAsyncResult "sel";
Command 1 "commit";

#戻す
InitializeSession "TESTDB";
Command "update T set C=3";
TerminateSession;

Command 1 "start transaction read only, using snapshot, isolation level serializable";
Command 2 "start transaction read write, isolation level serializable";
Command 2 "update T set C=5";
AsyncCommand "sel" 1 "select * from T";
Sleep 100;
Command 2 "rollback";
#↓{3}
GetAsyncResult "sel";
Command 1 "commit";

TerminateSession 1;
TerminateSession 2;

#InitializeSession "TESTDB";
#Command "drop table T";
#TerminateSession;

#InitializeSession "";
#Command "drop database TESTDB";
#TerminateSession;
# (障害回復を試すためTerminateしない)
End;
