mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-03 14:33:32 +03:00 
			
		
		
		
	BY A CONCURRENT TRANSACTIO The member function QUICK_RANGE_SELECT::init_ror_merged_scan() performs a table handler clone. Innodb does not provide a clone operation. The ha_innobase::clone() is not there. The handler::clone() does not take care of the ha_innobase->prebuilt->select_lock_type. Because of this what happens is that for one index we do a locking read, and for the other index we were doing a non-locking (consistent) read. The patch introduces ha_innobase::clone() member function. It is implemented similar to ha_myisam::clone(). It calls the base class handler::clone() and then does any additional operation required. I am setting the ha_innobase->prebuilt->select_lock_type correctly. rb://1060 approved by Marko
		
			
				
	
	
		
			59 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
--source include/have_innodb.inc
 | 
						|
--source include/have_debug.inc
 | 
						|
 | 
						|
create table t1 (
 | 
						|
  rowid int,
 | 
						|
  f1    int,
 | 
						|
  f2    int,
 | 
						|
  key i1 (f1, f2),
 | 
						|
  key i2 (f2)) engine=innodb;
 | 
						|
 | 
						|
show create table t1;
 | 
						|
insert into `t1` (rowid, f1, f2) values (1, 1, 10), (2, 1, NULL);
 | 
						|
 | 
						|
connect (a,localhost,root,,);
 | 
						|
connect (b,localhost,root,,);
 | 
						|
 | 
						|
connection a;
 | 
						|
start transaction with consistent snapshot;
 | 
						|
 | 
						|
connection b;
 | 
						|
start transaction;
 | 
						|
update t1 set f2 = 4  where f1 = 1 and f2 is null;
 | 
						|
 | 
						|
-- echo (b) Number of rows updated:
 | 
						|
select row_count();
 | 
						|
 | 
						|
insert into t1 values (3, 1, null);
 | 
						|
 | 
						|
-- echo (b) After update and insert query.
 | 
						|
select rowid, f1, f2 from t1;
 | 
						|
 | 
						|
commit;
 | 
						|
 | 
						|
connection a;
 | 
						|
 | 
						|
-- echo (a) Before the update statement is executed.
 | 
						|
select rowid, f1, f2 from t1;
 | 
						|
 | 
						|
SET SESSION debug="+d,bug14007649";
 | 
						|
update t1 set f2 = 6 where f1 = 1 and f2 is null;
 | 
						|
 | 
						|
-- echo (a) Number of rows updated:
 | 
						|
select row_count();
 | 
						|
 | 
						|
-- echo (a) After the update statement is executed.
 | 
						|
select rowid, f1, f2 from t1;
 | 
						|
 | 
						|
commit;
 | 
						|
 | 
						|
--echo "The trx with consistent snapshot ended."
 | 
						|
 | 
						|
select rowid, f1, f2 from t1;
 | 
						|
 | 
						|
connection default;
 | 
						|
disconnect a;
 | 
						|
disconnect b;
 | 
						|
 | 
						|
drop table t1;
 |