forked from postgres/postgres
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add isolation test for SERIALIZABLE READ ONLY DEFERRABLE.
This improves code coverage and lays a foundation for testing similar issues in a distributed environment. Author: Thomas Munro <[email protected]> Reviewed-by: Michael Paquier <[email protected]>
- Loading branch information
Showing
8 changed files
with
225 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
Parsed test spec with 3 sessions | ||
|
||
starting permutation: s2rx s2ry s1ry s1wy s1c s2wx s2c s3c | ||
step s2rx: SELECT balance FROM bank_account WHERE id = 'X'; | ||
balance | ||
|
||
0 | ||
step s2ry: SELECT balance FROM bank_account WHERE id = 'Y'; | ||
balance | ||
|
||
0 | ||
step s1ry: SELECT balance FROM bank_account WHERE id = 'Y'; | ||
balance | ||
|
||
0 | ||
step s1wy: UPDATE bank_account SET balance = 20 WHERE id = 'Y'; | ||
step s1c: COMMIT; | ||
step s2wx: UPDATE bank_account SET balance = -11 WHERE id = 'X'; | ||
step s2c: COMMIT; | ||
step s3c: COMMIT; | ||
|
||
starting permutation: s2rx s2ry s1ry s1wy s1c s3r s3c s2wx | ||
step s2rx: SELECT balance FROM bank_account WHERE id = 'X'; | ||
balance | ||
|
||
0 | ||
step s2ry: SELECT balance FROM bank_account WHERE id = 'Y'; | ||
balance | ||
|
||
0 | ||
step s1ry: SELECT balance FROM bank_account WHERE id = 'Y'; | ||
balance | ||
|
||
0 | ||
step s1wy: UPDATE bank_account SET balance = 20 WHERE id = 'Y'; | ||
step s1c: COMMIT; | ||
step s3r: SELECT id, balance FROM bank_account WHERE id IN ('X', 'Y') ORDER BY id; | ||
id balance | ||
|
||
X 0 | ||
Y 20 | ||
step s3c: COMMIT; | ||
step s2wx: UPDATE bank_account SET balance = -11 WHERE id = 'X'; | ||
ERROR: could not serialize access due to read/write dependencies among transactions |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
Parsed test spec with 3 sessions | ||
|
||
starting permutation: s2rx s2ry s1ry s1wy s1c s3r s2wx s2c s3c | ||
step s2rx: SELECT balance FROM bank_account WHERE id = 'X'; | ||
balance | ||
|
||
0 | ||
step s2ry: SELECT balance FROM bank_account WHERE id = 'Y'; | ||
balance | ||
|
||
0 | ||
step s1ry: SELECT balance FROM bank_account WHERE id = 'Y'; | ||
balance | ||
|
||
0 | ||
step s1wy: UPDATE bank_account SET balance = 20 WHERE id = 'Y'; | ||
step s1c: COMMIT; | ||
step s3r: SELECT id, balance FROM bank_account WHERE id IN ('X', 'Y') ORDER BY id; <waiting ...> | ||
step s2wx: UPDATE bank_account SET balance = -11 WHERE id = 'X'; | ||
step s2c: COMMIT; | ||
step s3r: <... completed> | ||
id balance | ||
|
||
X -11 | ||
Y 20 | ||
step s3c: COMMIT; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
Parsed test spec with 3 sessions | ||
|
||
starting permutation: s2rx s2ry s1ry s1wy s1c s3r s2wx s2c s3c | ||
step s2rx: SELECT balance FROM bank_account WHERE id = 'X'; | ||
balance | ||
|
||
0 | ||
step s2ry: SELECT balance FROM bank_account WHERE id = 'Y'; | ||
balance | ||
|
||
0 | ||
step s1ry: SELECT balance FROM bank_account WHERE id = 'Y'; | ||
balance | ||
|
||
0 | ||
step s1wy: UPDATE bank_account SET balance = 20 WHERE id = 'Y'; | ||
step s1c: COMMIT; | ||
step s3r: SELECT id, balance FROM bank_account WHERE id IN ('X', 'Y') ORDER BY id; | ||
id balance | ||
|
||
X 0 | ||
Y 20 | ||
step s2wx: UPDATE bank_account SET balance = -11 WHERE id = 'X'; | ||
step s2c: COMMIT; | ||
step s3c: COMMIT; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
# The example from the paper "A read-only transaction anomaly under snapshot | ||
# isolation"[1]. | ||
# | ||
# Here we test that serializable snapshot isolation (SERIALIZABLE) doesn't | ||
# suffer from the anomaly, because s2 is aborted upon detection of a cycle. | ||
# | ||
# [1] http:https://www.cs.umb.edu/~poneil/ROAnom.pdf | ||
|
||
setup | ||
{ | ||
CREATE TABLE bank_account (id TEXT PRIMARY KEY, balance DECIMAL NOT NULL); | ||
INSERT INTO bank_account (id, balance) VALUES ('X', 0), ('Y', 0); | ||
} | ||
|
||
teardown | ||
{ | ||
DROP TABLE bank_account; | ||
} | ||
|
||
session "s1" | ||
setup { BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; } | ||
step "s1ry" { SELECT balance FROM bank_account WHERE id = 'Y'; } | ||
step "s1wy" { UPDATE bank_account SET balance = 20 WHERE id = 'Y'; } | ||
step "s1c" { COMMIT; } | ||
|
||
session "s2" | ||
setup { BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; } | ||
step "s2rx" { SELECT balance FROM bank_account WHERE id = 'X'; } | ||
step "s2ry" { SELECT balance FROM bank_account WHERE id = 'Y'; } | ||
step "s2wx" { UPDATE bank_account SET balance = -11 WHERE id = 'X'; } | ||
step "s2c" { COMMIT; } | ||
|
||
session "s3" | ||
setup { BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; } | ||
step "s3r" { SELECT id, balance FROM bank_account WHERE id IN ('X', 'Y') ORDER BY id; } | ||
step "s3c" { COMMIT; } | ||
|
||
# without s3, s1 and s2 commit | ||
permutation "s2rx" "s2ry" "s1ry" "s1wy" "s1c" "s2wx" "s2c" "s3c" | ||
|
||
# once s3 observes the data committed by s1, a cycle is created and s2 aborts | ||
permutation "s2rx" "s2ry" "s1ry" "s1wy" "s1c" "s3r" "s3c" "s2wx" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
# The example from the paper "A read-only transaction anomaly under snapshot | ||
# isolation"[1]. | ||
# | ||
# Here we test that serializable snapshot isolation can avoid the anomaly | ||
# without aborting any tranasctions, by instead causing s3 to be deferred | ||
# until a safe snapshot can be taken. | ||
# | ||
# [1] http:https://www.cs.umb.edu/~poneil/ROAnom.pdf | ||
|
||
setup | ||
{ | ||
CREATE TABLE bank_account (id TEXT PRIMARY KEY, balance DECIMAL NOT NULL); | ||
INSERT INTO bank_account (id, balance) VALUES ('X', 0), ('Y', 0); | ||
} | ||
|
||
teardown | ||
{ | ||
DROP TABLE bank_account; | ||
} | ||
|
||
session "s1" | ||
setup { BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; } | ||
step "s1ry" { SELECT balance FROM bank_account WHERE id = 'Y'; } | ||
step "s1wy" { UPDATE bank_account SET balance = 20 WHERE id = 'Y'; } | ||
step "s1c" { COMMIT; } | ||
|
||
session "s2" | ||
setup { BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; } | ||
step "s2rx" { SELECT balance FROM bank_account WHERE id = 'X'; } | ||
step "s2ry" { SELECT balance FROM bank_account WHERE id = 'Y'; } | ||
step "s2wx" { UPDATE bank_account SET balance = -11 WHERE id = 'X'; } | ||
step "s2c" { COMMIT; } | ||
|
||
session "s3" | ||
setup { BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE READ ONLY DEFERRABLE; } | ||
step "s3r" { SELECT id, balance FROM bank_account WHERE id IN ('X', 'Y') ORDER BY id; } | ||
step "s3c" { COMMIT; } | ||
|
||
permutation "s2rx" "s2ry" "s1ry" "s1wy" "s1c" "s3r" "s2wx" "s2c" "s3c" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
# The example from the paper "A read-only transaction anomaly under snapshot | ||
# isolation"[1]. | ||
# | ||
# Here we use snapshot isolation (REPEATABLE READ), so that s3 sees a state of | ||
# afairs that is not consistent with any serial ordering of s1 and s2. | ||
# | ||
# [1] http:https://www.cs.umb.edu/~poneil/ROAnom.pdf | ||
|
||
setup | ||
{ | ||
CREATE TABLE bank_account (id TEXT PRIMARY KEY, balance DECIMAL NOT NULL); | ||
INSERT INTO bank_account (id, balance) VALUES ('X', 0), ('Y', 0); | ||
} | ||
|
||
teardown | ||
{ | ||
DROP TABLE bank_account; | ||
} | ||
|
||
session "s1" | ||
setup { BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; } | ||
step "s1ry" { SELECT balance FROM bank_account WHERE id = 'Y'; } | ||
step "s1wy" { UPDATE bank_account SET balance = 20 WHERE id = 'Y'; } | ||
step "s1c" { COMMIT; } | ||
|
||
session "s2" | ||
setup { BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; } | ||
step "s2rx" { SELECT balance FROM bank_account WHERE id = 'X'; } | ||
step "s2ry" { SELECT balance FROM bank_account WHERE id = 'Y'; } | ||
step "s2wx" { UPDATE bank_account SET balance = -11 WHERE id = 'X'; } | ||
step "s2c" { COMMIT; } | ||
|
||
session "s3" | ||
setup { BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; } | ||
step "s3r" { SELECT id, balance FROM bank_account WHERE id IN ('X', 'Y') ORDER BY id; } | ||
step "s3c" { COMMIT; } | ||
|
||
permutation "s2rx" "s2ry" "s1ry" "s1wy" "s1c" "s3r" "s2wx" "s2c" "s3c" |