mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-04 04:46:15 +01:00 
			
		
		
		
	bug #46947 "Embedded SELECT without FOR UPDATE is causing a lock". Fixed comments in tests. Improved comments and performance of auxiliary scripts. mysql-test/include/check_concurrent_insert.inc: Changed script to use temporary table for backing up data in order to make this operation less expensive. Made script more a bit generic by allowing to use multi-column tables with it. Improved comments. mysql-test/include/check_no_concurrent_insert.inc: Changed script to use temporary table for backing up data in order to make this operation less expensive. Made script more a bit generic by allowing to use multi-column tables with it. Improved comments. mysql-test/include/check_no_row_lock.inc: Improved comments in auxiliary script. mysql-test/r/innodb_mysql_lock2.result: Fixed errors in comments for test. mysql-test/r/lock_sync.result: Fixed typo in comments for test. mysql-test/t/innodb_mysql_lock2.test: Fixed errors in comments for test. mysql-test/t/lock_sync.test: Fixed typo in comments for test.
		
			
				
	
	
		
			71 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
#
 | 
						|
# SUMMARY
 | 
						|
#   Check if statement affecting or reading table '$table' doesn't
 | 
						|
#   take any kind of locks on its rows.
 | 
						|
#
 | 
						|
# PARAMETERS 
 | 
						|
#   $table      Table for which presence of row locks should be checked.
 | 
						|
#   $con_aux    Name of auxiliary connection to be used by this script.
 | 
						|
#   $statement  Statement to be checked.
 | 
						|
#
 | 
						|
# EXAMPLE
 | 
						|
#    innodb_mysql_lock2.test
 | 
						|
#
 | 
						|
--disable_result_log
 | 
						|
--disable_query_log
 | 
						|
 | 
						|
connection default;
 | 
						|
begin;
 | 
						|
--eval select * from $table for update;
 | 
						|
 | 
						|
connection $con_aux;
 | 
						|
begin;
 | 
						|
--send_eval $statement;
 | 
						|
 | 
						|
--enable_result_log
 | 
						|
--enable_query_log
 | 
						|
 | 
						|
connection default;
 | 
						|
# Wait until statement is successfully executed while
 | 
						|
# all rows in table are X-locked. This means that it
 | 
						|
# does not acquire any row locks.
 | 
						|
# We use wait_condition.inc instead of simply reaping 
 | 
						|
# statement here in order to avoid deadlocks if test
 | 
						|
# fails and to time out gracefully instead.
 | 
						|
let $wait_condition=
 | 
						|
  select count(*) = 0 from information_schema.processlist
 | 
						|
  where info = "$statement";
 | 
						|
--source include/wait_condition.inc
 | 
						|
 | 
						|
--disable_result_log
 | 
						|
--disable_query_log
 | 
						|
 | 
						|
if ($success)
 | 
						|
{
 | 
						|
# Apparently statement was successfully executed and thus it
 | 
						|
# has not required any row locks.
 | 
						|
# To be safe against wait_condition.inc succeeding due to
 | 
						|
# races let us first reap the statement being checked to
 | 
						|
# ensure that it has been successfully executed.
 | 
						|
connection $con_aux;
 | 
						|
--reap
 | 
						|
rollback;
 | 
						|
connection default;
 | 
						|
rollback;
 | 
						|
--echo Success: '$statement' doesn't take row locks on '$table'.
 | 
						|
}
 | 
						|
if (!$success)
 | 
						|
{
 | 
						|
# Waiting has timed out. Apparently statement was blocked on
 | 
						|
# some row lock. So to be able to continue we need to unlock
 | 
						|
# rows first.
 | 
						|
rollback;
 | 
						|
connection $con_aux;
 | 
						|
--reap
 | 
						|
rollback;
 | 
						|
connection default;
 | 
						|
--echo Error: '$statement' takes some row locks on '$table'!
 | 
						|
}
 | 
						|
 | 
						|
--enable_result_log
 | 
						|
--enable_query_log
 |