Commit 6cee60ea authored by unknown's avatar unknown
Browse files

Relaxed locking in INSERT...SELECT, single table UPDATE...SELECT and

single table DELETE...SELECT clauses when innobase_locks_unsafe_for_binlog
is used and isolation level of the transaction is not serializable. 
InnoDB uses consistent read in these cases for a selected table.
Backported from 5.0.x.


sql/ha_innodb.cc:
  Relaxed locking in INSERT...SELECT, single table UPDATE...SELECT and 
  single table DELETE...SELECT clauses when innobase_locks_unsafe_for_binlog
  is used and isolation level of the transaction is not serializable. 
  InnoDB uses consistent read in these cases for a selected table.
parent 5be12eba
Loading
Loading
Loading
Loading
+21 −2
Original line number Diff line number Diff line
@@ -5282,8 +5282,27 @@ ha_innobase::store_lock(
		are not simple SELECTs; note that select_lock_type in this
		case may get strengthened in ::external_lock() to LOCK_X. */

		if (srv_locks_unsafe_for_binlog &&
		    prebuilt->trx->isolation_level != TRX_ISO_SERIALIZABLE &&
		    (lock_type == TL_READ || lock_type == TL_READ_NO_INSERT) &&
		    thd->lex->sql_command != SQLCOM_SELECT &&
		    thd->lex->sql_command != SQLCOM_UPDATE_MULTI &&
		    thd->lex->sql_command != SQLCOM_DELETE_MULTI ) {

			/* In case we have innobase_locks_unsafe_for_binlog
			option set and isolation level of the transaction
			is not set to serializable and MySQL is doing
			INSERT INTO...SELECT without FOR UPDATE or IN
			SHARE MODE we use consistent read for select. 
			Similarly, in case of DELETE...SELECT and
			UPDATE...SELECT when these are not multi table.*/

			prebuilt->select_lock_type = LOCK_NONE;
			prebuilt->stored_select_lock_type = LOCK_NONE;
		} else {
			prebuilt->select_lock_type = LOCK_S;
			prebuilt->stored_select_lock_type = LOCK_S;
		}

	} else if (lock_type != TL_IGNORE) {