* eugene@stripped <eugene@stripped> [07/07/30 17:39]:
> ChangeSet@stripped, 2007-07-30 17:14:34+04:00, evgen@stripped +8 -0
> Bug#24989: The DEADLOCK error is improperly handled by InnoDB.
>
> When innodb detects a deadlock it calls ha_rollback_trans() to rollback the
> main transaction. But such action isn't allowed from inside of triggers and
> functions. When it happen the 'Explicit or implicit commit' error is thrown
> even if there is no commit/rollback statements in the trigger/function. This
> leads to the user confusion.
>
> Now the convert_error_code_to_mysql() function doesn't call the
> ha_rollback_trans() function directly but rather calls the
> mark_transaction_to_rollback function and returns an error.
> The sp_rcontext::find_handler() now doesn't allow errors to be caught by the
> trigger/function error handlers when the thd->is_fatal_sub_stmt_error flag
> is set. Procedures are still allowed to catch such errors.
> The sp_rcontext::find_handler function now accepts a THD handle as a parameter.
> The transaction_rollback_request and the is_fatal_sub_stmt_error flags are
> added to the THD class. The are initialized by the THD class constructor.
> Now the ha_autocommit_or_rollback function rolls back main transaction
> when not in a sub statement and the thd->transaction_rollback_request
> is set.
> The THD::restore_sub_statement_state function now resets the
> thd->is_fatal_sub_stmt_error flag on exit from a sub-statement.
OK to push. Please forward this commit to dev@stripped and
dev-innodb@stripped, as it modifies ha_innodb.cc and
innodb-big.test
Thank you for working on this.
--
-- Konstantin Osipov Software Developer, Moscow, Russia
-- MySQL AB, www.mysql.com The best DATABASE COMPANY in the GALAXY