mirror of
https://github.com/MariaDB/server.git
synced 2025-07-22 03:08:18 +02:00
239 lines
5.6 KiB
Text
239 lines
5.6 KiB
Text
connect disable_purging,localhost,root;
|
|
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
|
connection default;
|
|
#
|
|
# MDEV-26642 Weird SELECT view when a record is
|
|
# modified to the same value by two transactions
|
|
# MDEV-32898 Phantom rows caused by updates of PRIMARY KEY
|
|
#
|
|
CREATE TABLE t(a INT PRIMARY KEY, b INT) ENGINE=InnoDB;
|
|
INSERT INTO t VALUES (1,1),(2,2);
|
|
BEGIN;
|
|
SELECT * FROM t LOCK IN SHARE MODE;
|
|
a b
|
|
1 1
|
|
2 2
|
|
connect con_weird,localhost,root;
|
|
SET innodb_snapshot_isolation=OFF;
|
|
BEGIN;
|
|
SELECT * FROM t;
|
|
a b
|
|
1 1
|
|
2 2
|
|
connect consistent,localhost,root;
|
|
SET innodb_snapshot_isolation=ON;
|
|
BEGIN;
|
|
SELECT * FROM t;
|
|
a b
|
|
1 1
|
|
2 2
|
|
connection default;
|
|
UPDATE t SET a=3 WHERE b=2;
|
|
COMMIT;
|
|
connection consistent;
|
|
UPDATE t SET b=3;
|
|
ERROR HY000: Record has changed since last read in table 't'
|
|
SELECT * FROM t;
|
|
a b
|
|
1 1
|
|
3 2
|
|
COMMIT;
|
|
connection con_weird;
|
|
UPDATE t SET b=3;
|
|
SELECT * FROM t;
|
|
a b
|
|
1 3
|
|
2 2
|
|
3 3
|
|
COMMIT;
|
|
connection default;
|
|
SELECT * FROM t;
|
|
a b
|
|
1 3
|
|
3 3
|
|
DROP TABLE t;
|
|
#
|
|
# MDEV-26643 Inconsistent behaviors of UPDATE under
|
|
# READ UNCOMMITTED and READ COMMITTED isolation level
|
|
#
|
|
CREATE TABLE t(a INT, b INT) ENGINE=InnoDB STATS_PERSISTENT=0;
|
|
INSERT INTO t VALUES(NULL, 1), (2, 2);
|
|
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
|
BEGIN;
|
|
UPDATE t SET a = 10;
|
|
connection consistent;
|
|
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
|
SET DEBUG_SYNC="lock_wait_before_suspend SIGNAL select_blocked";
|
|
UPDATE t SET b = 20 WHERE a;
|
|
connection default;
|
|
SET DEBUG_SYNC="now WAIT_FOR select_blocked";
|
|
COMMIT;
|
|
connection consistent;
|
|
SELECT * FROM t;
|
|
a b
|
|
10 20
|
|
10 20
|
|
connection default;
|
|
TRUNCATE TABLE t;
|
|
INSERT INTO t VALUES(NULL, 1), (2, 2);
|
|
BEGIN;
|
|
UPDATE t SET a = 10;
|
|
connection consistent;
|
|
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
|
SET DEBUG_SYNC="lock_wait_before_suspend SIGNAL select_blocked";
|
|
UPDATE t SET b = 20 WHERE a;
|
|
connection default;
|
|
SET DEBUG_SYNC="now WAIT_FOR select_blocked";
|
|
COMMIT;
|
|
connection consistent;
|
|
SELECT * FROM t;
|
|
a b
|
|
10 20
|
|
10 20
|
|
connection default;
|
|
TRUNCATE TABLE t;
|
|
INSERT INTO t VALUES(NULL, 1), (2, 2);
|
|
BEGIN;
|
|
UPDATE t SET a = 10;
|
|
connection con_weird;
|
|
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
|
SET DEBUG_SYNC="lock_wait_before_suspend SIGNAL select_blocked";
|
|
UPDATE t SET b = 20 WHERE a;
|
|
connection default;
|
|
SET DEBUG_SYNC="now WAIT_FOR select_blocked";
|
|
SELECT * FROM t;
|
|
a b
|
|
10 1
|
|
10 2
|
|
COMMIT;
|
|
connection con_weird;
|
|
COMMIT;
|
|
connection default;
|
|
SELECT * FROM t;
|
|
a b
|
|
10 1
|
|
10 20
|
|
TRUNCATE TABLE t;
|
|
#
|
|
# MDEV-34108 Inappropriate semi-consistent read in snapshot isolation
|
|
#
|
|
INSERT INTO t VALUES(NULL, 1), (1, 1);
|
|
BEGIN;
|
|
UPDATE t SET b = 3;
|
|
connection consistent;
|
|
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
|
BEGIN;
|
|
SET DEBUG_SYNC="lock_wait_before_suspend SIGNAL select_blocked";
|
|
UPDATE t SET b = 2 WHERE a;
|
|
connection default;
|
|
SET DEBUG_SYNC="now WAIT_FOR select_blocked";
|
|
UPDATE t SET a = 1;
|
|
COMMIT;
|
|
connection consistent;
|
|
COMMIT;
|
|
connection default;
|
|
SELECT * FROM t;
|
|
a b
|
|
1 2
|
|
1 2
|
|
DROP TABLE t;
|
|
#
|
|
# MDEV-33802 Weird read view after ROLLBACK of other transactions
|
|
#
|
|
CREATE TABLE t(a INT PRIMARY KEY, b INT UNIQUE) ENGINE=InnoDB STATS_PERSISTENT=0;
|
|
connection consistent;
|
|
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
|
connection default;
|
|
INSERT INTO t SET a=1;
|
|
connection consistent;
|
|
SAVEPOINT sp1;
|
|
SELECT * FROM t FORCE INDEX (b) FOR UPDATE;
|
|
ERROR HY000: Record has changed since last read in table 't'
|
|
SAVEPOINT sp1;
|
|
connection default;
|
|
BEGIN;
|
|
INSERT INTO t SET a=2;
|
|
connection con_weird;
|
|
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
|
SET DEBUG_SYNC="lock_wait_before_suspend SIGNAL select_blocked";
|
|
SELECT * FROM t FORCE INDEX (b) FOR UPDATE;
|
|
connection default;
|
|
SET DEBUG_SYNC="now WAIT_FOR select_blocked";
|
|
ROLLBACK;
|
|
connection con_weird;
|
|
a b
|
|
1 NULL
|
|
SELECT * FROM t FORCE INDEX (b) FOR UPDATE;
|
|
a b
|
|
1 NULL
|
|
COMMIT;
|
|
disconnect con_weird;
|
|
connection consistent;
|
|
SELECT * FROM t FORCE INDEX (b) FOR UPDATE;
|
|
a b
|
|
1 NULL
|
|
COMMIT;
|
|
connection default;
|
|
TRUNCATE TABLE t;
|
|
#
|
|
# MDEV-36639 innodb_snapshot_isolation=1 gives error for not comitted row changes
|
|
#
|
|
INSERT INTO t VALUES (1,1),(2,2);
|
|
connection default;
|
|
# Case 1: Transaction A modifies a record, transaction B with snapshot
|
|
# isolation level is blocked by A, then A is committed.
|
|
# Expected behaviour: B gets ER_CHECKREAD.
|
|
BEGIN;
|
|
UPDATE t SET b=3 WHERE a = 1;
|
|
connection consistent;
|
|
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
|
|
BEGIN;
|
|
SELECT * FROM t;
|
|
a b
|
|
1 1
|
|
2 2
|
|
SET DEBUG_SYNC="lock_wait_before_suspend SIGNAL select_blocked";
|
|
SELECT * FROM t WHERE a=1 FOR UPDATE;
|
|
connection default;
|
|
SET DEBUG_SYNC="now WAIT_FOR select_blocked";
|
|
COMMIT;
|
|
connection consistent;
|
|
ERROR HY000: Record has changed since last read in table 't'
|
|
# Case 2: Transaction A modifies a record, transaction B with snapshot
|
|
# isolation level is blocked by A, then A is rolled back.
|
|
# Expected behaviour: B continues execution.
|
|
connection default;
|
|
BEGIN;
|
|
UPDATE t SET b=4 WHERE a=1;
|
|
connection consistent;
|
|
BEGIN;
|
|
SELECT * FROM t;
|
|
a b
|
|
2 2
|
|
1 3
|
|
SET DEBUG_SYNC="lock_wait_before_suspend SIGNAL select_blocked";
|
|
SELECT * FROM t WHERE a=1 FOR UPDATE;
|
|
connection default;
|
|
SET DEBUG_SYNC="now WAIT_FOR select_blocked";
|
|
ROLLBACK;
|
|
connection consistent;
|
|
a b
|
|
1 3
|
|
ROLLBACK;
|
|
# Case 3: Transaction B with snapshot isolation level started with
|
|
# consistent snapshot. Transaction A modifies a record and is committed.
|
|
# Both B tries to read modified by A record.
|
|
# Expected behavior: B gets ER_CHECKREAD.
|
|
connection consistent;
|
|
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
|
connection default;
|
|
UPDATE t SET b=4 WHERE a=1;
|
|
connection consistent;
|
|
SELECT * FROM t WHERE a=1 FOR UPDATE;
|
|
ERROR HY000: Record has changed since last read in table 't'
|
|
disconnect consistent;
|
|
disconnect disable_purging;
|
|
connection default;
|
|
SET DEBUG_SYNC="RESET";
|
|
DROP TABLE t;
|
|
# End of 10.6 tests
|