# 現象テスト (phantom, r/w, serializable)

# 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 (1), (2), (3)";

TerminateSession;



InitializeSession 1 "TESTDB";

InitializeSession 2 "TESTDB";



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

#Command 1 "select count(*) from T where C>=3";

Command 2 "insert into T (C) values (4), (5)";

AsyncCommand "sel" 1 "select count(*) from T where C>=3";

Sleep 1000;

#↓serializableでは{1}になるはず

GetAsyncResult "sel";

Command 1 "commit";



InitializeSession "TESTDB";

Command "delete from T where C>=4";

TerminateSession;



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

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

#Command 1 "select count(*) from T where C>=3";

Command 2 "insert into T (C) values (4), (5)";

AsyncCommand "sel" 1 "select count(*) from T where C>=3";

Sleep 1000;

Command 2 "commit";

#↓serializableでは{1}になるはず

GetAsyncResult "sel";

Command 1 "commit";



InitializeSession "TESTDB";

Command "delete from T where C>=4";

TerminateSession;



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

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

#Command 1 "select count(*) from T where C>=3";

Command 2 "insert into T (C) values (4), (5)";

AsyncCommand "sel" 1 "select count(*) from T where C>=3";

Sleep 1000;

Command 2 "commit";

#↓serializableでは{1}になるはず

GetAsyncResult "sel";

Command 1 "commit";



InitializeSession "TESTDB";

Command "delete from T where C>=4";

TerminateSession;



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

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

#Command 1 "select count(*) from T where C>=3";

Command 2 "insert into T (C) values (4), (5)";

AsyncCommand "sel" 1 "select count(*) from T where C>=3";

Sleep 1000;

Command 2 "commit";

#↓serializableでは{1}になるはず

GetAsyncResult "sel";

Command 1 "commit";



InitializeSession "TESTDB";

Command "delete from T where C>=4";

TerminateSession;



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

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

#Command 1 "select count(*) from T where C>=3";

Command 2 "insert into T (C) values (4), (5)";

AsyncCommand "sel" 1 "select count(*) from T where C>=3";

Sleep 1000;

Command 2 "commit";

#↓serializableでは{1}になるはず

GetAsyncResult "sel";

Command 1 "commit";





TerminateSession 1;

TerminateSession 2;



#InitializeSession "TESTDB";

#Command "drop table T";

#TerminateSession;



#InitializeSession "";

#Command "drop database TESTDB";

#TerminateSession;

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

End;