1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
|
Parsed test spec with 3 sessions
starting permutation: s2beginrr s3beginrr s1u s2donothing s1c s2c s3donothing s3c s2select
step s2beginrr: BEGIN ISOLATION LEVEL REPEATABLE READ;
step s3beginrr: BEGIN ISOLATION LEVEL REPEATABLE READ;
step s1u: UPDATE foo SET a=2, b=b || ' -> moved by session-1' WHERE a=1;
step s2donothing: INSERT INTO foo VALUES(1, 'session-2 donothing') ON CONFLICT DO NOTHING; <waiting ...>
step s1c: COMMIT;
step s2donothing: <... completed>
step s2c: COMMIT;
step s3donothing: INSERT INTO foo VALUES(2, 'session-3 donothing'), (2, 'session-3 donothing2') ON CONFLICT DO NOTHING;
step s3c: COMMIT;
step s2select: SELECT * FROM foo ORDER BY a;
a|b
-+-----------------------------------
1|session-2 donothing
2|initial tuple -> moved by session-1
(2 rows)
starting permutation: s2beginrr s3beginrr s1u s3donothing s1c s3c s2donothing s2c s2select
step s2beginrr: BEGIN ISOLATION LEVEL REPEATABLE READ;
step s3beginrr: BEGIN ISOLATION LEVEL REPEATABLE READ;
step s1u: UPDATE foo SET a=2, b=b || ' -> moved by session-1' WHERE a=1;
step s3donothing: INSERT INTO foo VALUES(2, 'session-3 donothing'), (2, 'session-3 donothing2') ON CONFLICT DO NOTHING; <waiting ...>
step s1c: COMMIT;
step s3donothing: <... completed>
ERROR: could not serialize access due to concurrent update
step s3c: COMMIT;
step s2donothing: INSERT INTO foo VALUES(1, 'session-2 donothing') ON CONFLICT DO NOTHING;
step s2c: COMMIT;
step s2select: SELECT * FROM foo ORDER BY a;
a|b
-+-----------------------------------
1|session-2 donothing
2|initial tuple -> moved by session-1
(2 rows)
starting permutation: s2beginrr s3beginrr s1u s2donothing s3donothing s1c s2c s3c s2select
step s2beginrr: BEGIN ISOLATION LEVEL REPEATABLE READ;
step s3beginrr: BEGIN ISOLATION LEVEL REPEATABLE READ;
step s1u: UPDATE foo SET a=2, b=b || ' -> moved by session-1' WHERE a=1;
step s2donothing: INSERT INTO foo VALUES(1, 'session-2 donothing') ON CONFLICT DO NOTHING; <waiting ...>
step s3donothing: INSERT INTO foo VALUES(2, 'session-3 donothing'), (2, 'session-3 donothing2') ON CONFLICT DO NOTHING; <waiting ...>
step s1c: COMMIT;
step s2donothing: <... completed>
step s3donothing: <... completed>
ERROR: could not serialize access due to concurrent update
step s2c: COMMIT;
step s3c: COMMIT;
step s2select: SELECT * FROM foo ORDER BY a;
a|b
-+-----------------------------------
1|session-2 donothing
2|initial tuple -> moved by session-1
(2 rows)
starting permutation: s2beginrr s3beginrr s1u s3donothing s2donothing s1c s3c s2c s2select
step s2beginrr: BEGIN ISOLATION LEVEL REPEATABLE READ;
step s3beginrr: BEGIN ISOLATION LEVEL REPEATABLE READ;
step s1u: UPDATE foo SET a=2, b=b || ' -> moved by session-1' WHERE a=1;
step s3donothing: INSERT INTO foo VALUES(2, 'session-3 donothing'), (2, 'session-3 donothing2') ON CONFLICT DO NOTHING; <waiting ...>
step s2donothing: INSERT INTO foo VALUES(1, 'session-2 donothing') ON CONFLICT DO NOTHING; <waiting ...>
step s1c: COMMIT;
step s3donothing: <... completed>
ERROR: could not serialize access due to concurrent update
step s2donothing: <... completed>
step s3c: COMMIT;
step s2c: COMMIT;
step s2select: SELECT * FROM foo ORDER BY a;
a|b
-+-----------------------------------
1|session-2 donothing
2|initial tuple -> moved by session-1
(2 rows)
starting permutation: s2begins s3begins s1u s2donothing s1c s2c s3donothing s3c s2select
step s2begins: BEGIN ISOLATION LEVEL SERIALIZABLE;
step s3begins: BEGIN ISOLATION LEVEL SERIALIZABLE;
step s1u: UPDATE foo SET a=2, b=b || ' -> moved by session-1' WHERE a=1;
step s2donothing: INSERT INTO foo VALUES(1, 'session-2 donothing') ON CONFLICT DO NOTHING; <waiting ...>
step s1c: COMMIT;
step s2donothing: <... completed>
step s2c: COMMIT;
step s3donothing: INSERT INTO foo VALUES(2, 'session-3 donothing'), (2, 'session-3 donothing2') ON CONFLICT DO NOTHING;
step s3c: COMMIT;
step s2select: SELECT * FROM foo ORDER BY a;
a|b
-+-----------------------------------
1|session-2 donothing
2|initial tuple -> moved by session-1
(2 rows)
starting permutation: s2begins s3begins s1u s3donothing s1c s3c s2donothing s2c s2select
step s2begins: BEGIN ISOLATION LEVEL SERIALIZABLE;
step s3begins: BEGIN ISOLATION LEVEL SERIALIZABLE;
step s1u: UPDATE foo SET a=2, b=b || ' -> moved by session-1' WHERE a=1;
step s3donothing: INSERT INTO foo VALUES(2, 'session-3 donothing'), (2, 'session-3 donothing2') ON CONFLICT DO NOTHING; <waiting ...>
step s1c: COMMIT;
step s3donothing: <... completed>
ERROR: could not serialize access due to concurrent update
step s3c: COMMIT;
step s2donothing: INSERT INTO foo VALUES(1, 'session-2 donothing') ON CONFLICT DO NOTHING;
step s2c: COMMIT;
step s2select: SELECT * FROM foo ORDER BY a;
a|b
-+-----------------------------------
1|session-2 donothing
2|initial tuple -> moved by session-1
(2 rows)
starting permutation: s2begins s3begins s1u s2donothing s3donothing s1c s2c s3c s2select
step s2begins: BEGIN ISOLATION LEVEL SERIALIZABLE;
step s3begins: BEGIN ISOLATION LEVEL SERIALIZABLE;
step s1u: UPDATE foo SET a=2, b=b || ' -> moved by session-1' WHERE a=1;
step s2donothing: INSERT INTO foo VALUES(1, 'session-2 donothing') ON CONFLICT DO NOTHING; <waiting ...>
step s3donothing: INSERT INTO foo VALUES(2, 'session-3 donothing'), (2, 'session-3 donothing2') ON CONFLICT DO NOTHING; <waiting ...>
step s1c: COMMIT;
step s2donothing: <... completed>
step s3donothing: <... completed>
ERROR: could not serialize access due to concurrent update
step s2c: COMMIT;
step s3c: COMMIT;
step s2select: SELECT * FROM foo ORDER BY a;
a|b
-+-----------------------------------
1|session-2 donothing
2|initial tuple -> moved by session-1
(2 rows)
starting permutation: s2begins s3begins s1u s3donothing s2donothing s1c s3c s2c s2select
step s2begins: BEGIN ISOLATION LEVEL SERIALIZABLE;
step s3begins: BEGIN ISOLATION LEVEL SERIALIZABLE;
step s1u: UPDATE foo SET a=2, b=b || ' -> moved by session-1' WHERE a=1;
step s3donothing: INSERT INTO foo VALUES(2, 'session-3 donothing'), (2, 'session-3 donothing2') ON CONFLICT DO NOTHING; <waiting ...>
step s2donothing: INSERT INTO foo VALUES(1, 'session-2 donothing') ON CONFLICT DO NOTHING; <waiting ...>
step s1c: COMMIT;
step s3donothing: <... completed>
ERROR: could not serialize access due to concurrent update
step s2donothing: <... completed>
step s3c: COMMIT;
step s2c: COMMIT;
step s2select: SELECT * FROM foo ORDER BY a;
a|b
-+-----------------------------------
1|session-2 donothing
2|initial tuple -> moved by session-1
(2 rows)
|