mirror of https://github.com/postgres/postgres
Commit 0e5680f473 contained a thinko
mixing LOCKMODE with LockTupleMode. This caused misbehavior in the case
where a tuple is marked with a multixact with at most a FOR SHARE lock,
and another transaction tries to acquire a FOR NO KEY EXCLUSIVE lock;
this case should block but doesn't.
Include a new isolation tester spec file to explicitely try all the
tuple lock combinations; without the fix it shows the problem:
starting permutation: s1_begin s1_lcksvpt s1_tuplock2 s2_tuplock3 s1_commit
step s1_begin: BEGIN;
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo;
a
1
step s1_tuplock2: SELECT * FROM multixact_conflict FOR SHARE;
a
1
step s2_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE;
a
1
step s1_commit: COMMIT;
With the fixed code, step s2_tuplock3 blocks until session 1 commits,
which is the correct behavior.
All other cases behave correctly.
Backpatch to 9.3, like the commit that introduced the problem.
pull/14/head
parent
2ea95959af
commit
d5e3d1e969
@ -0,0 +1,469 @@ |
||||
Parsed test spec with 2 sessions |
||||
|
||||
starting permutation: s1_begin s1_lcksvpt s1_tuplock1 s2_tuplock1 s1_commit |
||||
step s1_begin: BEGIN; |
||||
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; |
||||
a |
||||
|
||||
1 |
||||
step s1_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE; |
||||
a |
||||
|
||||
1 |
||||
step s2_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE; |
||||
a |
||||
|
||||
1 |
||||
step s1_commit: COMMIT; |
||||
|
||||
starting permutation: s1_begin s1_lcksvpt s1_tuplock1 s2_tuplock2 s1_commit |
||||
step s1_begin: BEGIN; |
||||
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; |
||||
a |
||||
|
||||
1 |
||||
step s1_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE; |
||||
a |
||||
|
||||
1 |
||||
step s2_tuplock2: SELECT * FROM multixact_conflict FOR SHARE; |
||||
a |
||||
|
||||
1 |
||||
step s1_commit: COMMIT; |
||||
|
||||
starting permutation: s1_begin s1_lcksvpt s1_tuplock1 s2_tuplock3 s1_commit |
||||
step s1_begin: BEGIN; |
||||
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; |
||||
a |
||||
|
||||
1 |
||||
step s1_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE; |
||||
a |
||||
|
||||
1 |
||||
step s2_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE; |
||||
a |
||||
|
||||
1 |
||||
step s1_commit: COMMIT; |
||||
|
||||
starting permutation: s1_begin s1_lcksvpt s1_tuplock1 s2_tuplock4 s1_commit |
||||
step s1_begin: BEGIN; |
||||
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; |
||||
a |
||||
|
||||
1 |
||||
step s1_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE; |
||||
a |
||||
|
||||
1 |
||||
step s2_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE; <waiting ...> |
||||
step s1_commit: COMMIT; |
||||
step s2_tuplock4: <... completed> |
||||
a |
||||
|
||||
1 |
||||
|
||||
starting permutation: s1_begin s1_lcksvpt s1_tuplock2 s2_tuplock1 s1_commit |
||||
step s1_begin: BEGIN; |
||||
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; |
||||
a |
||||
|
||||
1 |
||||
step s1_tuplock2: SELECT * FROM multixact_conflict FOR SHARE; |
||||
a |
||||
|
||||
1 |
||||
step s2_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE; |
||||
a |
||||
|
||||
1 |
||||
step s1_commit: COMMIT; |
||||
|
||||
starting permutation: s1_begin s1_lcksvpt s1_tuplock2 s2_tuplock2 s1_commit |
||||
step s1_begin: BEGIN; |
||||
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; |
||||
a |
||||
|
||||
1 |
||||
step s1_tuplock2: SELECT * FROM multixact_conflict FOR SHARE; |
||||
a |
||||
|
||||
1 |
||||
step s2_tuplock2: SELECT * FROM multixact_conflict FOR SHARE; |
||||
a |
||||
|
||||
1 |
||||
step s1_commit: COMMIT; |
||||
|
||||
starting permutation: s1_begin s1_lcksvpt s1_tuplock2 s2_tuplock3 s1_commit |
||||
step s1_begin: BEGIN; |
||||
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; |
||||
a |
||||
|
||||
1 |
||||
step s1_tuplock2: SELECT * FROM multixact_conflict FOR SHARE; |
||||
a |
||||
|
||||
1 |
||||
step s2_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE; <waiting ...> |
||||
step s1_commit: COMMIT; |
||||
step s2_tuplock3: <... completed> |
||||
a |
||||
|
||||
1 |
||||
|
||||
starting permutation: s1_begin s1_lcksvpt s1_tuplock2 s2_tuplock4 s1_commit |
||||
step s1_begin: BEGIN; |
||||
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; |
||||
a |
||||
|
||||
1 |
||||
step s1_tuplock2: SELECT * FROM multixact_conflict FOR SHARE; |
||||
a |
||||
|
||||
1 |
||||
step s2_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE; <waiting ...> |
||||
step s1_commit: COMMIT; |
||||
step s2_tuplock4: <... completed> |
||||
a |
||||
|
||||
1 |
||||
|
||||
starting permutation: s1_begin s1_lcksvpt s1_tuplock3 s2_tuplock1 s1_commit |
||||
step s1_begin: BEGIN; |
||||
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; |
||||
a |
||||
|
||||
1 |
||||
step s1_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE; |
||||
a |
||||
|
||||
1 |
||||
step s2_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE; |
||||
a |
||||
|
||||
1 |
||||
step s1_commit: COMMIT; |
||||
|
||||
starting permutation: s1_begin s1_lcksvpt s1_tuplock3 s2_tuplock2 s1_commit |
||||
step s1_begin: BEGIN; |
||||
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; |
||||
a |
||||
|
||||
1 |
||||
step s1_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE; |
||||
a |
||||
|
||||
1 |
||||
step s2_tuplock2: SELECT * FROM multixact_conflict FOR SHARE; <waiting ...> |
||||
step s1_commit: COMMIT; |
||||
step s2_tuplock2: <... completed> |
||||
a |
||||
|
||||
1 |
||||
|
||||
starting permutation: s1_begin s1_lcksvpt s1_tuplock3 s2_tuplock3 s1_commit |
||||
step s1_begin: BEGIN; |
||||
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; |
||||
a |
||||
|
||||
1 |
||||
step s1_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE; |
||||
a |
||||
|
||||
1 |
||||
step s2_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE; <waiting ...> |
||||
step s1_commit: COMMIT; |
||||
step s2_tuplock3: <... completed> |
||||
a |
||||
|
||||
1 |
||||
|
||||
starting permutation: s1_begin s1_lcksvpt s1_tuplock3 s2_tuplock4 s1_commit |
||||
step s1_begin: BEGIN; |
||||
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; |
||||
a |
||||
|
||||
1 |
||||
step s1_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE; |
||||
a |
||||
|
||||
1 |
||||
step s2_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE; <waiting ...> |
||||
step s1_commit: COMMIT; |
||||
step s2_tuplock4: <... completed> |
||||
a |
||||
|
||||
1 |
||||
|
||||
starting permutation: s1_begin s1_lcksvpt s1_tuplock4 s2_tuplock1 s1_commit |
||||
step s1_begin: BEGIN; |
||||
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; |
||||
a |
||||
|
||||
1 |
||||
step s1_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE; |
||||
a |
||||
|
||||
1 |
||||
step s2_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE; <waiting ...> |
||||
step s1_commit: COMMIT; |
||||
step s2_tuplock1: <... completed> |
||||
a |
||||
|
||||
1 |
||||
|
||||
starting permutation: s1_begin s1_lcksvpt s1_tuplock4 s2_tuplock2 s1_commit |
||||
step s1_begin: BEGIN; |
||||
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; |
||||
a |
||||
|
||||
1 |
||||
step s1_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE; |
||||
a |
||||
|
||||
1 |
||||
step s2_tuplock2: SELECT * FROM multixact_conflict FOR SHARE; <waiting ...> |
||||
step s1_commit: COMMIT; |
||||
step s2_tuplock2: <... completed> |
||||
a |
||||
|
||||
1 |
||||
|
||||
starting permutation: s1_begin s1_lcksvpt s1_tuplock4 s2_tuplock3 s1_commit |
||||
step s1_begin: BEGIN; |
||||
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; |
||||
a |
||||
|
||||
1 |
||||
step s1_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE; |
||||
a |
||||
|
||||
1 |
||||
step s2_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE; <waiting ...> |
||||
step s1_commit: COMMIT; |
||||
step s2_tuplock3: <... completed> |
||||
a |
||||
|
||||
1 |
||||
|
||||
starting permutation: s1_begin s1_lcksvpt s1_tuplock4 s2_tuplock4 s1_commit |
||||
step s1_begin: BEGIN; |
||||
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; |
||||
a |
||||
|
||||
1 |
||||
step s1_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE; |
||||
a |
||||
|
||||
1 |
||||
step s2_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE; <waiting ...> |
||||
step s1_commit: COMMIT; |
||||
step s2_tuplock4: <... completed> |
||||
a |
||||
|
||||
1 |
||||
|
||||
starting permutation: s1_begin s1_tuplock1 s2_tuplock1 s1_commit |
||||
step s1_begin: BEGIN; |
||||
step s1_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE; |
||||
a |
||||
|
||||
1 |
||||
step s2_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE; |
||||
a |
||||
|
||||
1 |
||||
step s1_commit: COMMIT; |
||||
|
||||
starting permutation: s1_begin s1_tuplock1 s2_tuplock2 s1_commit |
||||
step s1_begin: BEGIN; |
||||
step s1_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE; |
||||
a |
||||
|
||||
1 |
||||
step s2_tuplock2: SELECT * FROM multixact_conflict FOR SHARE; |
||||
a |
||||
|
||||
1 |
||||
step s1_commit: COMMIT; |
||||
|
||||
starting permutation: s1_begin s1_tuplock1 s2_tuplock3 s1_commit |
||||
step s1_begin: BEGIN; |
||||
step s1_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE; |
||||
a |
||||
|
||||
1 |
||||
step s2_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE; |
||||
a |
||||
|
||||
1 |
||||
step s1_commit: COMMIT; |
||||
|
||||
starting permutation: s1_begin s1_tuplock1 s2_tuplock4 s1_commit |
||||
step s1_begin: BEGIN; |
||||
step s1_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE; |
||||
a |
||||
|
||||
1 |
||||
step s2_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE; <waiting ...> |
||||
step s1_commit: COMMIT; |
||||
step s2_tuplock4: <... completed> |
||||
a |
||||
|
||||
1 |
||||
|
||||
starting permutation: s1_begin s1_tuplock2 s2_tuplock1 s1_commit |
||||
step s1_begin: BEGIN; |
||||
step s1_tuplock2: SELECT * FROM multixact_conflict FOR SHARE; |
||||
a |
||||
|
||||
1 |
||||
step s2_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE; |
||||
a |
||||
|
||||
1 |
||||
step s1_commit: COMMIT; |
||||
|
||||
starting permutation: s1_begin s1_tuplock2 s2_tuplock2 s1_commit |
||||
step s1_begin: BEGIN; |
||||
step s1_tuplock2: SELECT * FROM multixact_conflict FOR SHARE; |
||||
a |
||||
|
||||
1 |
||||
step s2_tuplock2: SELECT * FROM multixact_conflict FOR SHARE; |
||||
a |
||||
|
||||
1 |
||||
step s1_commit: COMMIT; |
||||
|
||||
starting permutation: s1_begin s1_tuplock2 s2_tuplock3 s1_commit |
||||
step s1_begin: BEGIN; |
||||
step s1_tuplock2: SELECT * FROM multixact_conflict FOR SHARE; |
||||
a |
||||
|
||||
1 |
||||
step s2_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE; <waiting ...> |
||||
step s1_commit: COMMIT; |
||||
step s2_tuplock3: <... completed> |
||||
a |
||||
|
||||
1 |
||||
|
||||
starting permutation: s1_begin s1_tuplock2 s2_tuplock4 s1_commit |
||||
step s1_begin: BEGIN; |
||||
step s1_tuplock2: SELECT * FROM multixact_conflict FOR SHARE; |
||||
a |
||||
|
||||
1 |
||||
step s2_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE; <waiting ...> |
||||
step s1_commit: COMMIT; |
||||
step s2_tuplock4: <... completed> |
||||
a |
||||
|
||||
1 |
||||
|
||||
starting permutation: s1_begin s1_tuplock3 s2_tuplock1 s1_commit |
||||
step s1_begin: BEGIN; |
||||
step s1_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE; |
||||
a |
||||
|
||||
1 |
||||
step s2_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE; |
||||
a |
||||
|
||||
1 |
||||
step s1_commit: COMMIT; |
||||
|
||||
starting permutation: s1_begin s1_tuplock3 s2_tuplock2 s1_commit |
||||
step s1_begin: BEGIN; |
||||
step s1_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE; |
||||
a |
||||
|
||||
1 |
||||
step s2_tuplock2: SELECT * FROM multixact_conflict FOR SHARE; <waiting ...> |
||||
step s1_commit: COMMIT; |
||||
step s2_tuplock2: <... completed> |
||||
a |
||||
|
||||
1 |
||||
|
||||
starting permutation: s1_begin s1_tuplock3 s2_tuplock3 s1_commit |
||||
step s1_begin: BEGIN; |
||||
step s1_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE; |
||||
a |
||||
|
||||
1 |
||||
step s2_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE; <waiting ...> |
||||
step s1_commit: COMMIT; |
||||
step s2_tuplock3: <... completed> |
||||
a |
||||
|
||||
1 |
||||
|
||||
starting permutation: s1_begin s1_tuplock3 s2_tuplock4 s1_commit |
||||
step s1_begin: BEGIN; |
||||
step s1_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE; |
||||
a |
||||
|
||||
1 |
||||
step s2_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE; <waiting ...> |
||||
step s1_commit: COMMIT; |
||||
step s2_tuplock4: <... completed> |
||||
a |
||||
|
||||
1 |
||||
|
||||
starting permutation: s1_begin s1_tuplock4 s2_tuplock1 s1_commit |
||||
step s1_begin: BEGIN; |
||||
step s1_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE; |
||||
a |
||||
|
||||
1 |
||||
step s2_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE; <waiting ...> |
||||
step s1_commit: COMMIT; |
||||
step s2_tuplock1: <... completed> |
||||
a |
||||
|
||||
1 |
||||
|
||||
starting permutation: s1_begin s1_tuplock4 s2_tuplock2 s1_commit |
||||
step s1_begin: BEGIN; |
||||
step s1_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE; |
||||
a |
||||
|
||||
1 |
||||
step s2_tuplock2: SELECT * FROM multixact_conflict FOR SHARE; <waiting ...> |
||||
step s1_commit: COMMIT; |
||||
step s2_tuplock2: <... completed> |
||||
a |
||||
|
||||
1 |
||||
|
||||
starting permutation: s1_begin s1_tuplock4 s2_tuplock3 s1_commit |
||||
step s1_begin: BEGIN; |
||||
step s1_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE; |
||||
a |
||||
|
||||
1 |
||||
step s2_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE; <waiting ...> |
||||
step s1_commit: COMMIT; |
||||
step s2_tuplock3: <... completed> |
||||
a |
||||
|
||||
1 |
||||
|
||||
starting permutation: s1_begin s1_tuplock4 s2_tuplock4 s1_commit |
||||
step s1_begin: BEGIN; |
||||
step s1_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE; |
||||
a |
||||
|
||||
1 |
||||
step s2_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE; <waiting ...> |
||||
step s1_commit: COMMIT; |
||||
step s2_tuplock4: <... completed> |
||||
a |
||||
|
||||
1 |
||||
@ -0,0 +1,63 @@ |
||||
# Here we verify that tuple lock levels conform to their documented |
||||
# conflict tables. |
||||
|
||||
setup { |
||||
DROP TABLE IF EXISTS multixact_conflict; |
||||
CREATE TABLE multixact_conflict (a int primary key); |
||||
INSERT INTO multixact_conflict VALUES (1); |
||||
} |
||||
|
||||
teardown { |
||||
DROP TABLE multixact_conflict; |
||||
} |
||||
|
||||
session "s1" |
||||
step "s1_begin" { BEGIN; } |
||||
step "s1_lcksvpt" { SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; } |
||||
step "s1_tuplock1" { SELECT * FROM multixact_conflict FOR KEY SHARE; } |
||||
step "s1_tuplock2" { SELECT * FROM multixact_conflict FOR SHARE; } |
||||
step "s1_tuplock3" { SELECT * FROM multixact_conflict FOR NO KEY UPDATE; } |
||||
step "s1_tuplock4" { SELECT * FROM multixact_conflict FOR UPDATE; } |
||||
step "s1_commit" { COMMIT; } |
||||
|
||||
session "s2" |
||||
step "s2_tuplock1" { SELECT * FROM multixact_conflict FOR KEY SHARE; } |
||||
step "s2_tuplock2" { SELECT * FROM multixact_conflict FOR SHARE; } |
||||
step "s2_tuplock3" { SELECT * FROM multixact_conflict FOR NO KEY UPDATE; } |
||||
step "s2_tuplock4" { SELECT * FROM multixact_conflict FOR UPDATE; } |
||||
|
||||
# The version with savepoints test the multixact cases |
||||
permutation "s1_begin" "s1_lcksvpt" "s1_tuplock1" "s2_tuplock1" "s1_commit" |
||||
permutation "s1_begin" "s1_lcksvpt" "s1_tuplock1" "s2_tuplock2" "s1_commit" |
||||
permutation "s1_begin" "s1_lcksvpt" "s1_tuplock1" "s2_tuplock3" "s1_commit" |
||||
permutation "s1_begin" "s1_lcksvpt" "s1_tuplock1" "s2_tuplock4" "s1_commit" |
||||
permutation "s1_begin" "s1_lcksvpt" "s1_tuplock2" "s2_tuplock1" "s1_commit" |
||||
permutation "s1_begin" "s1_lcksvpt" "s1_tuplock2" "s2_tuplock2" "s1_commit" |
||||
permutation "s1_begin" "s1_lcksvpt" "s1_tuplock2" "s2_tuplock3" "s1_commit" |
||||
permutation "s1_begin" "s1_lcksvpt" "s1_tuplock2" "s2_tuplock4" "s1_commit" |
||||
permutation "s1_begin" "s1_lcksvpt" "s1_tuplock3" "s2_tuplock1" "s1_commit" |
||||
permutation "s1_begin" "s1_lcksvpt" "s1_tuplock3" "s2_tuplock2" "s1_commit" |
||||
permutation "s1_begin" "s1_lcksvpt" "s1_tuplock3" "s2_tuplock3" "s1_commit" |
||||
permutation "s1_begin" "s1_lcksvpt" "s1_tuplock3" "s2_tuplock4" "s1_commit" |
||||
permutation "s1_begin" "s1_lcksvpt" "s1_tuplock4" "s2_tuplock1" "s1_commit" |
||||
permutation "s1_begin" "s1_lcksvpt" "s1_tuplock4" "s2_tuplock2" "s1_commit" |
||||
permutation "s1_begin" "s1_lcksvpt" "s1_tuplock4" "s2_tuplock3" "s1_commit" |
||||
permutation "s1_begin" "s1_lcksvpt" "s1_tuplock4" "s2_tuplock4" "s1_commit" |
||||
|
||||
# no multixacts here |
||||
permutation "s1_begin" "s1_tuplock1" "s2_tuplock1" "s1_commit" |
||||
permutation "s1_begin" "s1_tuplock1" "s2_tuplock2" "s1_commit" |
||||
permutation "s1_begin" "s1_tuplock1" "s2_tuplock3" "s1_commit" |
||||
permutation "s1_begin" "s1_tuplock1" "s2_tuplock4" "s1_commit" |
||||
permutation "s1_begin" "s1_tuplock2" "s2_tuplock1" "s1_commit" |
||||
permutation "s1_begin" "s1_tuplock2" "s2_tuplock2" "s1_commit" |
||||
permutation "s1_begin" "s1_tuplock2" "s2_tuplock3" "s1_commit" |
||||
permutation "s1_begin" "s1_tuplock2" "s2_tuplock4" "s1_commit" |
||||
permutation "s1_begin" "s1_tuplock3" "s2_tuplock1" "s1_commit" |
||||
permutation "s1_begin" "s1_tuplock3" "s2_tuplock2" "s1_commit" |
||||
permutation "s1_begin" "s1_tuplock3" "s2_tuplock3" "s1_commit" |
||||
permutation "s1_begin" "s1_tuplock3" "s2_tuplock4" "s1_commit" |
||||
permutation "s1_begin" "s1_tuplock4" "s2_tuplock1" "s1_commit" |
||||
permutation "s1_begin" "s1_tuplock4" "s2_tuplock2" "s1_commit" |
||||
permutation "s1_begin" "s1_tuplock4" "s2_tuplock3" "s1_commit" |
||||
permutation "s1_begin" "s1_tuplock4" "s2_tuplock4" "s1_commit" |
||||
Loading…
Reference in new issue