Loading sql/sql_parse.cc +18 −0 Original line number Diff line number Diff line Loading @@ -1376,6 +1376,24 @@ mysql_execute_command(void) start_slave(thd); break; case SQLCOM_SLAVE_STOP: /* if the client thread has locked tables, a deadlock is possible. Assume that - the client thread does LOCK TABLE t READ. - then the master updates t. - then the SQL slave thread wants to update t, so it waits for the client thread because t is locked by it. - then the client thread does SLAVE STOP. SLAVE STOP waits for the SQL slave thread to terminate its update t, which waits for the client thread because t is locked by it. To prevent that, refuse SLAVE STOP if the client thread has locked tables */ if (thd->locked_tables || thd->active_transaction()) { send_error(&thd->net,ER_LOCK_OR_ACTIVE_TRANSACTION); break; } stop_slave(thd); break; Loading Loading
sql/sql_parse.cc +18 −0 Original line number Diff line number Diff line Loading @@ -1376,6 +1376,24 @@ mysql_execute_command(void) start_slave(thd); break; case SQLCOM_SLAVE_STOP: /* if the client thread has locked tables, a deadlock is possible. Assume that - the client thread does LOCK TABLE t READ. - then the master updates t. - then the SQL slave thread wants to update t, so it waits for the client thread because t is locked by it. - then the client thread does SLAVE STOP. SLAVE STOP waits for the SQL slave thread to terminate its update t, which waits for the client thread because t is locked by it. To prevent that, refuse SLAVE STOP if the client thread has locked tables */ if (thd->locked_tables || thd->active_transaction()) { send_error(&thd->net,ER_LOCK_OR_ACTIVE_TRANSACTION); break; } stop_slave(thd); break; Loading