144 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			144 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
| 
								 | 
							
								-- source include/have_innodb.inc
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Check and select innodb lock type
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								set global innodb_table_locks=1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select @@innodb_table_locks;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Testing of explicit table locks with enforced table locks
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								connect (con1,localhost,root,,);
							 | 
						||
| 
								 | 
							
								connect (con2,localhost,root,,);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--disable_warnings
							 | 
						||
| 
								 | 
							
								drop table if exists t1;
							 | 
						||
| 
								 | 
							
								--enable_warnings
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Testing of explicit table locks with enforced table locks
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								set @@innodb_table_locks=1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								connection con1;
							 | 
						||
| 
								 | 
							
								create table t1 (id integer, x integer) engine=INNODB;
							 | 
						||
| 
								 | 
							
								insert into t1 values(0, 0);
							 | 
						||
| 
								 | 
							
								set autocommit=0;
							 | 
						||
| 
								 | 
							
								SELECT * from t1 where id = 0 FOR UPDATE;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								connection con2;
							 | 
						||
| 
								 | 
							
								set autocommit=0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# The following statement should hang because con1 is locking the page
							 | 
						||
| 
								 | 
							
								--send
							 | 
						||
| 
								 | 
							
								lock table t1 write;
							 | 
						||
| 
								 | 
							
								--sleep 2
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								connection con1;
							 | 
						||
| 
								 | 
							
								update t1 set x=1 where id = 0;
							 | 
						||
| 
								 | 
							
								select * from t1;
							 | 
						||
| 
								 | 
							
								commit;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								connection con2;
							 | 
						||
| 
								 | 
							
								reap;
							 | 
						||
| 
								 | 
							
								update t1 set x=2 where id = 0;
							 | 
						||
| 
								 | 
							
								commit;
							 | 
						||
| 
								 | 
							
								unlock tables;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								connection con1;
							 | 
						||
| 
								 | 
							
								select * from t1;
							 | 
						||
| 
								 | 
							
								commit;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Try with old lock method (where LOCK TABLE is ignored by InnoDB)
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								set @@innodb_table_locks=0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								create table t1 (id integer primary key, x integer) engine=INNODB;
							 | 
						||
| 
								 | 
							
								insert into t1 values(0, 0),(1,1),(2,2);
							 | 
						||
| 
								 | 
							
								commit;
							 | 
						||
| 
								 | 
							
								SELECT * from t1 where id = 0 FOR UPDATE;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								connection con2;
							 | 
						||
| 
								 | 
							
								set autocommit=0;
							 | 
						||
| 
								 | 
							
								set @@innodb_table_locks=0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# The following statement should work becase innodb doesn't check table locks
							 | 
						||
| 
								 | 
							
								lock table t1 write;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								connection con1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# This will be locked by MySQL
							 | 
						||
| 
								 | 
							
								--send
							 | 
						||
| 
								 | 
							
								update t1 set x=10 where id = 2;
							 | 
						||
| 
								 | 
							
								--sleep 2
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								connection con2;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Note that we will get a deadlock if we try to select any rows marked
							 | 
						||
| 
								 | 
							
								# for update by con1 !
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								SELECT * from t1 where id = 2;
							 | 
						||
| 
								 | 
							
								UPDATE t1 set x=3 where id = 2;
							 | 
						||
| 
								 | 
							
								commit;
							 | 
						||
| 
								 | 
							
								SELECT * from t1;
							 | 
						||
| 
								 | 
							
								commit;
							 | 
						||
| 
								 | 
							
								unlock tables;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								connection con1;
							 | 
						||
| 
								 | 
							
								reap;
							 | 
						||
| 
								 | 
							
								commit;
							 | 
						||
| 
								 | 
							
								select * from t1;
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# End of 4.1 tests
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--echo #
							 | 
						||
| 
								 | 
							
								--echo #Bug#12842206 INNODB LOCKING REGRESSION FOR INSERT IGNORE
							 | 
						||
| 
								 | 
							
								--echo #fixed by re-fixing Bug#7975
							 | 
						||
| 
								 | 
							
								--echo #aka Bug#11759688 52020: InnoDB can still deadlock on just INSERT...
							 | 
						||
| 
								 | 
							
								--echo #
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								connection default;
							 | 
						||
| 
								 | 
							
								CREATE TABLE t1 (a INT PRIMARY KEY, b INT NOT NULL) ENGINE=InnoDB;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								INSERT INTO t1 VALUES(3,1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								BEGIN;
							 | 
						||
| 
								 | 
							
								# this used to wrongly acquire an X lock; now it takes an S lock
							 | 
						||
| 
								 | 
							
								INSERT IGNORE INTO t1 VALUES(3,14);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								connection con1;
							 | 
						||
| 
								 | 
							
								BEGIN;
							 | 
						||
| 
								 | 
							
								# this used to wrongly acquire an X lock; now it takes an S lock
							 | 
						||
| 
								 | 
							
								INSERT IGNORE INTO t1 VALUES(3,23);
							 | 
						||
| 
								 | 
							
								--send
							 | 
						||
| 
								 | 
							
								SELECT * FROM t1 FOR UPDATE;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								connection con2;
							 | 
						||
| 
								 | 
							
								# Check that the above SELECT is blocked
							 | 
						||
| 
								 | 
							
								let $wait_condition=
							 | 
						||
| 
								 | 
							
								  select count(*) = 1 from information_schema.processlist
							 | 
						||
| 
								 | 
							
								  where state = 'Sending data' and
							 | 
						||
| 
								 | 
							
								        info = 'SELECT * FROM t1 FOR UPDATE';
							 | 
						||
| 
								 | 
							
								--source include/wait_condition.inc
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								connection default;
							 | 
						||
| 
								 | 
							
								COMMIT;
							 | 
						||
| 
								 | 
							
								connection con1;
							 | 
						||
| 
								 | 
							
								reap;
							 | 
						||
| 
								 | 
							
								COMMIT;
							 | 
						||
| 
								 | 
							
								disconnect con1;
							 | 
						||
| 
								 | 
							
								disconnect con2;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								connection default;
							 | 
						||
| 
								 | 
							
								DROP TABLE t1;
							 |