Bug #45309: InnoDB does not rollback for delete and update
queries if query was killed Since we rely on thd->is_error() to decide whether we should COMMIT or ROLLBACK after a query execution, check the query 'killed' state and throw an error before calling ha_autocommit_or_rollback(), not after. The patch was tested manually. For reliable results, the test case would have to KILL QUERY while a DELETE/UPDATE query in another thread is still running. I don't see a way to achieve this kind of synchronization in our test suite (no debug_sync in 5.1). sql/sql_parse.cc: Since we rely on thd->is_error() to decide whether we should COMMIT or ROLLBACK after query execution, check the query 'killed' state and throw an error before calling ha_autocommit_or_rollback(), not after.
This commit is contained in:
parent
5ce0b41fb2
commit
73cbaa6d17
@ -1560,14 +1560,6 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If commit fails, we should be able to reset the OK status. */
|
|
||||||
thd->main_da.can_overwrite_status= TRUE;
|
|
||||||
ha_autocommit_or_rollback(thd, thd->is_error());
|
|
||||||
thd->main_da.can_overwrite_status= FALSE;
|
|
||||||
|
|
||||||
thd->transaction.stmt.reset();
|
|
||||||
|
|
||||||
|
|
||||||
/* report error issued during command execution */
|
/* report error issued during command execution */
|
||||||
if (thd->killed_errno())
|
if (thd->killed_errno())
|
||||||
{
|
{
|
||||||
@ -1580,6 +1572,13 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
|||||||
thd->mysys_var->abort= 0;
|
thd->mysys_var->abort= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If commit fails, we should be able to reset the OK status. */
|
||||||
|
thd->main_da.can_overwrite_status= TRUE;
|
||||||
|
ha_autocommit_or_rollback(thd, thd->is_error());
|
||||||
|
thd->main_da.can_overwrite_status= FALSE;
|
||||||
|
|
||||||
|
thd->transaction.stmt.reset();
|
||||||
|
|
||||||
net_end_statement(thd);
|
net_end_statement(thd);
|
||||||
query_cache_end_of_result(thd);
|
query_cache_end_of_result(thd);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user