# 現象テスト(dirty read, read uncommitted)

# 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 "set transaction read write, isolation level read uncommitted";
Command 1 "start transaction read write";

Command 2 "set transaction read write, isolation level read uncommitted";
Command 2 "start transaction read write";

Command 2 "update T set C=5";

AsyncCommand "sel" 1 "select * from T";

Sleep 100;

Command 2 "rollback";

#↓1がread uncommittedのときのみ{5}となる

GetAsyncResult "sel";

Command 1 "commit";



#戻す

InitializeSession "TESTDB";

Command "update T set C=3";

TerminateSession;



Command 1 "set transaction read write, isolation level read uncommitted";
Command 1 "start transaction read write";

Command 2 "set transaction read write, isolation level read committed";
Command 2 "start transaction read write";

Command 2 "update T set C=5";

AsyncCommand "sel" 1 "select * from T";

Sleep 100;

Command 2 "rollback";

#↓1がread uncommittedのときのみ{5}となる

GetAsyncResult "sel";

Command 1 "commit";



#戻す

InitializeSession "TESTDB";

Command "update T set C=3";

TerminateSession;



Command 1 "set transaction read write, isolation level read uncommitted";
Command 1 "start transaction read write";

Command 2 "set transaction read write, isolation level repeatable read";
Command 2 "start transaction read write";

Command 2 "update T set C=5";

AsyncCommand "sel" 1 "select * from T";

Sleep 100;

Command 2 "rollback";

#↓1がread uncommittedのときのみ{5}となる

GetAsyncResult "sel";

Command 1 "commit";



#戻す

InitializeSession "TESTDB";

Command "update T set C=3";

TerminateSession;



Command 1 "set transaction read write, isolation level read uncommitted";
Command 1 "start transaction read write";

Command 2 "set transaction read write, isolation level serializable";
Command 2 "start transaction read write";

Command 2 "update T set C=5";

AsyncCommand "sel" 1 "select * from T";

Sleep 100;

Command 2 "rollback";

#↓1がread uncommittedのときのみ{5}となる

GetAsyncResult "sel";

Command 1 "commit";



TerminateSession 1;

TerminateSession 2;



#InitializeSession "TESTDB";

#Command "drop table T";

#TerminateSession;



#InitializeSession "";

#Command "drop database TESTDB";

#TerminateSession;

# (障害回復を試すためTerminateしない)

End;

