diff options
author | Heikki Linnakangas | 2011-06-21 11:32:11 +0000 |
---|---|---|
committer | Heikki Linnakangas | 2011-06-21 11:49:50 +0000 |
commit | 1eea8e8a06bc718836c34b8f7da9420b38fc4851 (patch) | |
tree | 90d68b04494e2aec0330ca731062cdd15cbfe4a4 /src/test | |
parent | 7cb2ff9621a6129cc251f9d06bf23d3f9d426173 (diff) |
Fix bug in PreCommit_CheckForSerializationFailure. A transaction that has
already been marked as PREPARED cannot be killed. Kill the current
transaction instead.
One of the prepared_xacts regression tests actually hits this bug. I
removed the anomaly from the duplicate-gids test so that it fails in the
intended way, and added a new test to check serialization failures with
a prepared transaction.
Dan Ports
Diffstat (limited to 'src/test')
-rw-r--r-- | src/test/regress/expected/prepared_xacts.out | 47 | ||||
-rw-r--r-- | src/test/regress/sql/prepared_xacts.sql | 22 |
2 files changed, 62 insertions, 7 deletions
diff --git a/src/test/regress/expected/prepared_xacts.out b/src/test/regress/expected/prepared_xacts.out index 1a6b4ce1d94..328cd7426ec 100644 --- a/src/test/regress/expected/prepared_xacts.out +++ b/src/test/regress/expected/prepared_xacts.out @@ -88,17 +88,17 @@ SELECT gid FROM pg_prepared_xacts; BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; INSERT INTO pxtest1 VALUES ('fff'); +-- This should fail, because the gid foo3 is already in use +PREPARE TRANSACTION 'foo3'; +ERROR: transaction identifier "foo3" is already in use SELECT * FROM pxtest1; foobar -------- aaa ddd - fff -(3 rows) +(2 rows) --- This should fail, because the gid foo3 is already in use -PREPARE TRANSACTION 'foo3'; -ERROR: transaction identifier "foo3" is already in use +ROLLBACK PREPARED 'foo3'; SELECT * FROM pxtest1; foobar -------- @@ -106,7 +106,24 @@ SELECT * FROM pxtest1; ddd (2 rows) -ROLLBACK PREPARED 'foo3'; +-- Test serialization failure (SSI) +BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +UPDATE pxtest1 SET foobar = 'eee' WHERE foobar = 'ddd'; +SELECT * FROM pxtest1; + foobar +-------- + aaa + eee +(2 rows) + +PREPARE TRANSACTION 'foo4'; +SELECT gid FROM pg_prepared_xacts; + gid +------ + foo4 +(1 row) + +BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; SELECT * FROM pxtest1; foobar -------- @@ -114,6 +131,24 @@ SELECT * FROM pxtest1; ddd (2 rows) +INSERT INTO pxtest1 VALUES ('fff'); +-- This should fail, because the two transactions have a write-skew anomaly +PREPARE TRANSACTION 'foo5'; +ERROR: could not serialize access due to read/write dependencies among transactions +DETAIL: Cancelled on commit attempt with conflict in from prepared pivot. +HINT: The transaction might succeed if retried. +SELECT gid FROM pg_prepared_xacts; + gid +------ + foo4 +(1 row) + +ROLLBACK PREPARED 'foo4'; +SELECT gid FROM pg_prepared_xacts; + gid +----- +(0 rows) + -- Clean up DROP TABLE pxtest1; -- Test subtransactions diff --git a/src/test/regress/sql/prepared_xacts.sql b/src/test/regress/sql/prepared_xacts.sql index 2bdbb0d1891..e06c9d47c13 100644 --- a/src/test/regress/sql/prepared_xacts.sql +++ b/src/test/regress/sql/prepared_xacts.sql @@ -54,7 +54,6 @@ SELECT gid FROM pg_prepared_xacts; BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; INSERT INTO pxtest1 VALUES ('fff'); -SELECT * FROM pxtest1; -- This should fail, because the gid foo3 is already in use PREPARE TRANSACTION 'foo3'; @@ -65,6 +64,27 @@ ROLLBACK PREPARED 'foo3'; SELECT * FROM pxtest1; +-- Test serialization failure (SSI) +BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +UPDATE pxtest1 SET foobar = 'eee' WHERE foobar = 'ddd'; +SELECT * FROM pxtest1; +PREPARE TRANSACTION 'foo4'; + +SELECT gid FROM pg_prepared_xacts; + +BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +SELECT * FROM pxtest1; +INSERT INTO pxtest1 VALUES ('fff'); + +-- This should fail, because the two transactions have a write-skew anomaly +PREPARE TRANSACTION 'foo5'; + +SELECT gid FROM pg_prepared_xacts; + +ROLLBACK PREPARED 'foo4'; + +SELECT gid FROM pg_prepared_xacts; + -- Clean up DROP TABLE pxtest1; |