Commit 95dec435 authored by unknown's avatar unknown
Browse files

Bug#7879: Using TL_READ_NO_INSERT locks instead of TL_READ locks when

reading tables in "complex" SQL statements. If inserts happen in a
table being read, the statements have no serialization order and the
change can therefore not be reproduced on the slave.


sql/sql_update.cc:
  Switching to using T_READ_NO_INSERT when the binlog is used.
sql/sql_yacc.yy:
  Switching to using T_READ_NO_INSERT when the binlog is used.
parent 04498c2a
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -479,7 +479,10 @@ int mysql_multi_update(THD *thd,
      else
      {
	DBUG_PRINT("info",("setting table `%s` for read-only", tl->alias));
	tl->lock_type= TL_READ;
	// If we are using the binary log, we need TL_READ_NO_INSERT to get
	// correct order of statements. Otherwise, we use a TL_READ lock to
	// improve performance.
	tl->lock_type= using_update_log ? TL_READ_NO_INSERT : TL_READ;
	tl->updating= 0;
	wants= SELECT_ACL;
      }
+2 −2
Original line number Diff line number Diff line
@@ -822,7 +822,7 @@ create_select:
          SELECT_SYM
          {
	    LEX *lex=Lex;
	    lex->lock_option= (using_update_log) ? TL_READ_NO_INSERT : TL_READ;
	    lex->lock_option= using_update_log ? TL_READ_NO_INSERT : TL_READ;
	    if (lex->sql_command == SQLCOM_INSERT)
	      lex->sql_command= SQLCOM_INSERT_SELECT;
	    else if (lex->sql_command == SQLCOM_REPLACE)