Commit 3625c1e1 authored by Alexey Kopytov's avatar Alexey Kopytov

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).
parent 2f935906
...@@ -1560,14 +1560,6 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -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, ...@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment