# 現象テスト (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 "start transaction read write, isolation level serializable";
#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 "start transaction read write, isolation level serializable";
Command 2 "start transaction read write, isolation level read uncommitted";
#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 "start transaction read write, isolation level serializable";
Command 2 "start transaction read write, isolation level read committed";
#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 "start transaction read write, isolation level serializable";
Command 2 "start transaction read write, isolation level repeatable read";
#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 "start transaction read write, isolation level serializable";
Command 2 "start transaction read write, isolation level serializable";
#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;