mirror of
https://github.com/MariaDB/server.git
synced 2025-08-07 00:04:31 +03:00
handler.cc, ha_innodb.cc:
Fix Bug #8650 : InnoDB does not rollback SQL statement at an error
This commit is contained in:
@@ -748,17 +748,37 @@ ha_innobase::update_thd(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
Registers the InnoDB transaction in MySQL, to receive commit/rollback
|
Registers that InnoDB takes part in an SQL statement, so that MySQL knows to
|
||||||
events. This function must be called every time InnoDB starts a
|
roll back the statement if the statement results in an error. This MUST be
|
||||||
transaction internally. */
|
called for every SQL statement that may be rolled back by MySQL. Calling this
|
||||||
static
|
several times to register the same statement is allowed, too. */
|
||||||
|
inline
|
||||||
void
|
void
|
||||||
register_trans(
|
innobase_register_stmt(
|
||||||
/*===========*/
|
/*===================*/
|
||||||
THD* thd) /* in: thd to use the handle */
|
THD* thd) /* in: MySQL thd (connection) object */
|
||||||
{
|
{
|
||||||
/* Register the start of the statement */
|
/* Register the statement */
|
||||||
trans_register_ha(thd, FALSE, &innobase_hton);
|
trans_register_ha(thd, FALSE, &innobase_hton);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Registers an InnoDB transaction in MySQL, so that the MySQL XA code knows
|
||||||
|
to call the InnoDB prepare and commit, or rollback for the transaction. This
|
||||||
|
MUST be called for every transaction for which the user may call commit or
|
||||||
|
rollback. Calling this several times to register the same transaction is
|
||||||
|
allowed, too.
|
||||||
|
This function also registers the current SQL statement. */
|
||||||
|
inline
|
||||||
|
void
|
||||||
|
innobase_register_trx_and_stmt(
|
||||||
|
/*===========================*/
|
||||||
|
THD* thd) /* in: MySQL thd (connection) object */
|
||||||
|
{
|
||||||
|
/* NOTE that actually innobase_register_stmt() registers also
|
||||||
|
the transaction in the AUTOCOMMIT=1 mode. */
|
||||||
|
|
||||||
|
innobase_register_stmt(thd);
|
||||||
|
|
||||||
if (thd->options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) {
|
if (thd->options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) {
|
||||||
|
|
||||||
@@ -914,7 +934,7 @@ innobase_query_caching_of_table_permitted(
|
|||||||
|
|
||||||
if (trx->active_trans == 0) {
|
if (trx->active_trans == 0) {
|
||||||
|
|
||||||
register_trans(thd);
|
innobase_register_trx_and_stmt(thd);
|
||||||
trx->active_trans = 1;
|
trx->active_trans = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1030,7 +1050,7 @@ ha_innobase::init_table_handle_for_HANDLER(void)
|
|||||||
|
|
||||||
if (prebuilt->trx->active_trans == 0) {
|
if (prebuilt->trx->active_trans == 0) {
|
||||||
|
|
||||||
register_trans(current_thd);
|
innobase_register_trx_and_stmt(current_thd);
|
||||||
|
|
||||||
prebuilt->trx->active_trans = 1;
|
prebuilt->trx->active_trans = 1;
|
||||||
}
|
}
|
||||||
@@ -1421,7 +1441,7 @@ innobase_start_trx_and_assign_read_view(
|
|||||||
|
|
||||||
if (trx->active_trans == 0) {
|
if (trx->active_trans == 0) {
|
||||||
|
|
||||||
register_trans(current_thd);
|
innobase_register_trx_and_stmt(current_thd);
|
||||||
|
|
||||||
trx->active_trans = 1;
|
trx->active_trans = 1;
|
||||||
}
|
}
|
||||||
@@ -5544,8 +5564,10 @@ ha_innobase::start_stmt(
|
|||||||
/* Set the MySQL flag to mark that there is an active transaction */
|
/* Set the MySQL flag to mark that there is an active transaction */
|
||||||
if (trx->active_trans == 0) {
|
if (trx->active_trans == 0) {
|
||||||
|
|
||||||
register_trans(thd);
|
innobase_register_trx_and_stmt(thd);
|
||||||
trx->active_trans = 1;
|
trx->active_trans = 1;
|
||||||
|
} else {
|
||||||
|
innobase_register_stmt(thd);
|
||||||
}
|
}
|
||||||
|
|
||||||
return(0);
|
return(0);
|
||||||
@@ -5616,8 +5638,10 @@ ha_innobase::external_lock(
|
|||||||
transaction */
|
transaction */
|
||||||
if (trx->active_trans == 0) {
|
if (trx->active_trans == 0) {
|
||||||
|
|
||||||
register_trans(thd);
|
innobase_register_trx_and_stmt(thd);
|
||||||
trx->active_trans = 1;
|
trx->active_trans = 1;
|
||||||
|
} else if (trx->n_mysql_tables_in_use == 0) {
|
||||||
|
innobase_register_stmt(thd);
|
||||||
}
|
}
|
||||||
|
|
||||||
trx->n_mysql_tables_in_use++;
|
trx->n_mysql_tables_in_use++;
|
||||||
@@ -5780,7 +5804,7 @@ ha_innobase::transactional_table_lock(
|
|||||||
/* Set the MySQL flag to mark that there is an active transaction */
|
/* Set the MySQL flag to mark that there is an active transaction */
|
||||||
if (trx->active_trans == 0) {
|
if (trx->active_trans == 0) {
|
||||||
|
|
||||||
register_trans(thd);
|
innobase_register_trx_and_stmt(thd);
|
||||||
trx->active_trans = 1;
|
trx->active_trans = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -520,14 +520,14 @@ void trans_register_ha(THD *thd, bool all, handlerton *ht_arg)
|
|||||||
else
|
else
|
||||||
trans= &thd->transaction.stmt;
|
trans= &thd->transaction.stmt;
|
||||||
|
|
||||||
#ifndef DBUG_OFF
|
|
||||||
handlerton **ht=trans->ht;
|
handlerton **ht=trans->ht;
|
||||||
while (*ht)
|
while (*ht)
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(*ht != ht_arg);
|
if (*ht == ht_arg)
|
||||||
|
DBUG_VOID_RETURN; /* already registered, return */
|
||||||
ht++;
|
ht++;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
trans->ht[trans->nht++]=ht_arg;
|
trans->ht[trans->nht++]=ht_arg;
|
||||||
trans->no_2pc|=(ht_arg->prepare==0);
|
trans->no_2pc|=(ht_arg->prepare==0);
|
||||||
if (thd->transaction.xid.is_null())
|
if (thd->transaction.xid.is_null())
|
||||||
|
Reference in New Issue
Block a user