polardbxengine/mysql-test/suite/innodb/r/innodb-lock-inherit-read_co...

283 lines
10 KiB
Plaintext

#
# Bug #21025880 DUPLICATE UK VALUES IN READ-COMMITTED(AGAIN)
#
CREATE TABLE t1 (
a INT NOT NULL,
b INT NOT NULL,
PRIMARY KEY(b),
UNIQUE KEY(a))
ENGINE=INNODB;
SET @old_innodb_stats_auto_recalc = @@innodb_stats_auto_recalc;
SET GLOBAL innodb_stats_auto_recalc = OFF;
SET GLOBAL innodb_purge_stop_now = ON;
SET @old_transaction_isolation = @@transaction_isolation;
SET GLOBAL transaction_isolation = 'READ-COMMITTED';
SET @old_innodb_lock_wait_timeout = @@innodb_lock_wait_timeout;
SET GLOBAL innodb_lock_wait_timeout = 1;
INSERT INTO t1 VALUES (1,1),(2,2);
DELETE FROM t1;
SET debug_sync = 'row_ins_sec_index_entry_dup_locks_created SIGNAL
con1_locks_done WAIT_FOR con1_go';
SET debug_sync = 'ha_commit_trans_after_acquire_commit_lock SIGNAL
con1_insert_done WAIT_FOR con1_finish';
REPLACE INTO t1 VALUES (1,2);
SET debug_sync = 'now WAIT_FOR con1_locks_done';
SET debug_sync = 'lock_wait_suspend_thread_enter SIGNAL con2_blocked
WAIT_FOR con2_go';
SET debug_sync = 'ha_commit_trans_after_acquire_commit_lock SIGNAL
con2_insert_done WAIT_FOR con2_finish';
SET debug_sync = 'ib_after_row_insert SIGNAL con2_insert_done';
REPLACE INTO t1 VALUES (1,3);
SET debug_sync = 'now WAIT_FOR con2_blocked';
SET GLOBAL innodb_purge_run_now=ON;
SET debug_sync = 'now SIGNAL con2_go WAIT_FOR con2_insert_done';
SET debug_sync = 'now SIGNAL con1_go WAIT_FOR con1_insert_done';
SET debug_sync = 'now SIGNAL con1_finish';
SET debug_sync = 'now SIGNAL con2_finish';
SELECT * FROM t1;
a b
1 2
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
DROP TABLE t1;
SET GLOBAL innodb_stats_auto_recalc = @old_innodb_stats_auto_recalc;
SET GLOBAL transaction_isolation = @old_transaction_isolation;
SET GLOBAL innodb_lock_wait_timeout = @old_innodb_lock_wait_timeout;
SET DEBUG_SYNC= 'RESET';
CREATE TABLE t1 (
a INT NOT NULL,
b INT NOT NULL,
PRIMARY KEY(b),
UNIQUE KEY(a))
ENGINE=INNODB;
SET @old_innodb_stats_auto_recalc = @@innodb_stats_auto_recalc;
SET GLOBAL innodb_stats_auto_recalc = OFF;
SET GLOBAL innodb_purge_stop_now = ON;
SET @old_transaction_isolation = @@transaction_isolation;
SET GLOBAL transaction_isolation = 'READ-COMMITTED';
SET @old_innodb_lock_wait_timeout = @@innodb_lock_wait_timeout;
SET GLOBAL innodb_lock_wait_timeout = 1;
INSERT INTO t1 VALUES (1,1),(2,2);
DELETE FROM t1;
SET debug_sync = 'row_ins_sec_index_entry_dup_locks_created SIGNAL
con1_locks_done WAIT_FOR con1_go';
SET debug_sync = 'ha_commit_trans_after_acquire_commit_lock SIGNAL
con1_insert_done WAIT_FOR con1_finish';
INSERT INTO t1 values (1,2) ON DUPLICATE KEY UPDATE a=2;
SET debug_sync = 'now WAIT_FOR con1_locks_done';
SET debug_sync = 'lock_wait_suspend_thread_enter SIGNAL con2_blocked
WAIT_FOR con2_go';
SET debug_sync = 'ha_commit_trans_after_acquire_commit_lock SIGNAL
con2_insert_done WAIT_FOR con2_finish';
SET debug_sync = 'ib_after_row_insert SIGNAL con2_insert_done';
REPLACE INTO t1 VALUES (1,3);
SET debug_sync = 'now WAIT_FOR con2_blocked';
SET GLOBAL innodb_purge_run_now=ON;
SET debug_sync = 'now SIGNAL con2_go WAIT_FOR con2_insert_done';
SET debug_sync = 'now SIGNAL con1_go WAIT_FOR con1_insert_done';
SET debug_sync = 'now SIGNAL con1_finish';
SET debug_sync = 'now SIGNAL con2_finish';
SELECT * FROM t1;
a b
1 2
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
DROP TABLE t1;
SET GLOBAL innodb_stats_auto_recalc = @old_innodb_stats_auto_recalc;
SET GLOBAL transaction_isolation = @old_transaction_isolation;
SET GLOBAL innodb_lock_wait_timeout = @old_innodb_lock_wait_timeout;
SET DEBUG_SYNC= 'RESET';
CREATE TABLE t1 (
a INT NOT NULL,
b INT NOT NULL,
PRIMARY KEY(b),
UNIQUE KEY(a))
ENGINE=INNODB;
SET @old_innodb_stats_auto_recalc = @@innodb_stats_auto_recalc;
SET GLOBAL innodb_stats_auto_recalc = OFF;
SET GLOBAL innodb_purge_stop_now = ON;
SET @old_transaction_isolation = @@transaction_isolation;
SET GLOBAL transaction_isolation = 'READ-COMMITTED';
SET @old_innodb_lock_wait_timeout = @@innodb_lock_wait_timeout;
SET GLOBAL innodb_lock_wait_timeout = 1;
INSERT INTO t1 VALUES (1,1),(2,2);
DELETE FROM t1;
SET debug_sync = 'row_ins_sec_index_entry_dup_locks_created SIGNAL
con1_locks_done WAIT_FOR con1_go';
SET debug_sync = 'ha_commit_trans_after_acquire_commit_lock SIGNAL
con1_insert_done WAIT_FOR con1_finish';
INSERT INTO t1 VALUES (1,2);
SET debug_sync = 'now WAIT_FOR con1_locks_done';
SET debug_sync = 'lock_wait_suspend_thread_enter SIGNAL con2_blocked
WAIT_FOR con2_go';
SET debug_sync = 'ha_commit_trans_after_acquire_commit_lock SIGNAL
con2_insert_done WAIT_FOR con2_finish';
SET debug_sync = 'ib_after_row_insert SIGNAL con2_insert_done';
REPLACE INTO t1 VALUES (1,3);
SET debug_sync = 'now WAIT_FOR con2_blocked';
SET GLOBAL innodb_purge_run_now=ON;
SET debug_sync = 'now SIGNAL con2_go WAIT_FOR con2_insert_done';
SET debug_sync = 'now SIGNAL con1_go WAIT_FOR con1_insert_done';
SET debug_sync = 'now SIGNAL con1_finish';
SET debug_sync = 'now SIGNAL con2_finish';
SELECT * FROM t1;
a b
1 2
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
DROP TABLE t1;
SET GLOBAL innodb_stats_auto_recalc = @old_innodb_stats_auto_recalc;
SET GLOBAL transaction_isolation = @old_transaction_isolation;
SET GLOBAL innodb_lock_wait_timeout = @old_innodb_lock_wait_timeout;
SET DEBUG_SYNC= 'RESET';
#
# Bug#24344131 ASSERT !OTHER_LOCK IN LOCK_REC_ADD_TO_QUEUE AT LOCK0LOCK.CC:1641
#
CREATE TABLE t1(a INT, b INT, primary key(a));
INSERT INTO t1 VALUES(101, 20);
SET DEBUG_SYNC="before_lock_trx_release_locks SIGNAL s3 WAIT_FOR s5";
BEGIN;
INSERT INTO t1 VALUES(10, 20);
SET DEBUG_SYNC="before_lock_rec_convert_impl_to_expl_for_trx SIGNAL s2 WAIT_FOR s4";
SET DEBUG_SYNC="before_lock_wait_suspend SIGNAL s5 WAIT_FOR s7";
UPDATE t1 SET b=25 WHERE a=10;
SET DEBUG_SYNC="now WAIT_FOR s2";
COMMIT;
SET DEBUG_SYNC="now WAIT_FOR s3";
SET DEBUG_SYNC="after_lock_clust_rec_read_check_and_lock SIGNAL s4 WAIT_FOR s6";
UPDATE t1 SET b=30 WHERE a=10;
SET DEBUG_SYNC="now SIGNAL s6";
SET DEBUG_SYNC="now SIGNAL s7";
DROP TABLE t1;
#
# Bug #29004362 LOCK->TRX->DUPLICATES CAN NOT BE USED TO DETERMINE IF
# LOCK IS CREATED BY IODKU
#
CREATE TABLE t1 (
a INT NOT NULL,
b INT NOT NULL,
c INT NOT NULL,
PRIMARY KEY(b),
UNIQUE KEY(a),
UNIQUE KEY(c))
ENGINE=INNODB;
SET @old_innodb_stats_auto_recalc = @@innodb_stats_auto_recalc;
SET GLOBAL innodb_stats_auto_recalc = OFF;
SET GLOBAL innodb_purge_stop_now = ON;
SET @old_transaction_isolation = @@transaction_isolation;
SET GLOBAL transaction_isolation = 'READ-COMMITTED';
SET @old_innodb_lock_wait_timeout = @@innodb_lock_wait_timeout;
SET GLOBAL innodb_lock_wait_timeout = 1;
INSERT INTO t1 VALUES (1,1,1),(2,2,2);
DELETE FROM t1;
INSERT INTO t1 VALUES (5,5,5),(7,7,7);
BEGIN;
INSERT INTO t1 VALUES (1,4,7) ON DUPLICATE KEY UPDATE b=6;
SELECT MAX(engine_transaction_id) INTO @con1_trx_id FROM performance_schema.data_locks WHERE object_schema='test' AND object_name = 't1';
# LOCKS AFTER IODKU
SELECT IF(engine_transaction_id=@con1_trx_id, "con1", "other") as con,
index_name,lock_type,lock_mode,lock_status,lock_data
FROM performance_schema.data_locks
WHERE object_schema='test' AND object_name = 't1'
ORDER BY 1,2,3,4,5,6;
con index_name lock_type lock_mode lock_status lock_data
con1 NULL TABLE IX GRANTED NULL
con1 a RECORD X GRANTED 1, 1
con1 a RECORD X GRANTED 2, 2
con1 a RECORD X GRANTED supremum pseudo-record
con1 a RECORD X,GAP GRANTED 2, 2
con1 a RECORD X,GAP GRANTED 7, 6
con1 a RECORD X,GAP GRANTED 7, 7
con1 a RECORD X,REC_NOT_GAP GRANTED 7, 7
con1 c RECORD X GRANTED 7, 7
con1 c RECORD X GRANTED supremum pseudo-record
con1 c RECORD X,GAP GRANTED 7, 6
con1 PRIMARY RECORD X,REC_NOT_GAP GRANTED 7
SET debug_sync = 'row_ins_sec_index_entry_dup_locks_created SIGNAL
con1_locks_done WAIT_FOR con1_go';
INSERT INTO t1 VALUES (1,2,3);COMMIT;
SET debug_sync = 'now WAIT_FOR con1_locks_done';
# LOCKS AFTER con1_locks_done
SELECT IF(engine_transaction_id=@con1_trx_id, "con1", "other") as con,
index_name,lock_type,lock_mode,lock_status,lock_data
FROM performance_schema.data_locks
WHERE object_schema='test' AND object_name = 't1'
ORDER BY 1,2,3,4,5,6;
con index_name lock_type lock_mode lock_status lock_data
con1 NULL TABLE IX GRANTED NULL
con1 a RECORD X GRANTED 1, 1
con1 a RECORD X GRANTED 2, 2
con1 a RECORD X GRANTED supremum pseudo-record
con1 a RECORD X,GAP GRANTED 2, 2
con1 a RECORD X,GAP GRANTED 7, 6
con1 a RECORD X,GAP GRANTED 7, 7
con1 a RECORD X,REC_NOT_GAP GRANTED 7, 7
con1 c RECORD X GRANTED 7, 7
con1 c RECORD X GRANTED supremum pseudo-record
con1 c RECORD X,GAP GRANTED 7, 6
con1 PRIMARY RECORD S,REC_NOT_GAP GRANTED 2
con1 PRIMARY RECORD X,REC_NOT_GAP GRANTED 7
SELECT COUNT(*) FROM performance_schema.data_locks
WHERE object_schema='test'
AND object_name='t1'
AND index_name='a'
AND lock_type='RECORD'
AND lock_data='5, 5';
COUNT(*)
0
SET GLOBAL innodb_purge_run_now=ON;
# LOCKS AFTER purge
SELECT IF(engine_transaction_id=@con1_trx_id, "con1", "other") as con,
index_name,lock_type,lock_mode,lock_status,lock_data
FROM performance_schema.data_locks
WHERE object_schema='test' AND object_name = 't1'
ORDER BY 1,2,3,4,5,6;
con index_name lock_type lock_mode lock_status lock_data
con1 NULL TABLE IX GRANTED NULL
con1 a RECORD X GRANTED supremum pseudo-record
con1 a RECORD X,GAP GRANTED 5, 5
con1 a RECORD X,GAP GRANTED 7, 6
con1 a RECORD X,GAP GRANTED 7, 7
con1 a RECORD X,REC_NOT_GAP GRANTED 7, 7
con1 c RECORD X GRANTED 7, 7
con1 c RECORD X GRANTED supremum pseudo-record
con1 c RECORD X,GAP GRANTED 7, 6
con1 PRIMARY RECORD S,REC_NOT_GAP GRANTED 2
con1 PRIMARY RECORD X,REC_NOT_GAP GRANTED 7
INSERT t1 VALUES (1,10,4);
# LOCKS AFTER con2
SELECT IF(engine_transaction_id=@con1_trx_id, "con1", "other") as con,
index_name,lock_type,lock_mode,lock_status,lock_data
FROM performance_schema.data_locks
WHERE object_schema='test' AND object_name = 't1'
ORDER BY 1,2,3,4,5,6;
con index_name lock_type lock_mode lock_status lock_data
con1 NULL TABLE IX GRANTED NULL
con1 a RECORD X GRANTED supremum pseudo-record
con1 a RECORD X,GAP GRANTED 5, 5
con1 a RECORD X,GAP GRANTED 7, 6
con1 a RECORD X,GAP GRANTED 7, 7
con1 a RECORD X,REC_NOT_GAP GRANTED 7, 7
con1 c RECORD X GRANTED 7, 7
con1 c RECORD X GRANTED supremum pseudo-record
con1 c RECORD X,GAP GRANTED 7, 6
con1 PRIMARY RECORD S,REC_NOT_GAP GRANTED 2
con1 PRIMARY RECORD X,REC_NOT_GAP GRANTED 7
SET debug_sync = 'now SIGNAL con1_go';
SELECT * FROM t1;
a b c
1 2 3
5 5 5
7 6 7
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
DROP TABLE t1;
SET GLOBAL innodb_stats_auto_recalc = @old_innodb_stats_auto_recalc;
SET GLOBAL transaction_isolation = @old_transaction_isolation;
SET GLOBAL innodb_lock_wait_timeout = @old_innodb_lock_wait_timeout;
SET DEBUG_SYNC= 'RESET';