mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 03:52:35 +01:00
Clean-up, give better names, add comments to
thd->in_multi_stmt_transaction() and thd->active_transaction(). include/mysql_com.h: Comment SERVER_STATUS_IN_TRANS flag. sql/ha_ndbcluster.cc: Rename: thd->in_multi_stmt_transaction() -> thd->in_multi_stmt_transaction_mode(). sql/handler.cc: Add comments. sql/log.cc: Rename: thd->in_multi_stmt_transaction() -> thd->in_multi_stmt_transaction_mode(). sql/log_event.cc: Rename: thd->in_multi_stmt_transaction() -> thd->in_multi_stmt_transaction_mode(). sql/sql_base.cc: Rename: thd->in_multi_stmt_transaction() -> thd->in_multi_stmt_transaction_mode(). sql/sql_cache.cc: Rename: thd->active_transaction() -> thd->in_active_multi_stmt_transaction(). sql/sql_class.cc: Rename: thd->in_multi_stmt_transaction() -> thd->in_multi_stmt_transaction_mode(). sql/sql_class.h: Rename and comment two transaction processing- related methods. sql/sql_parse.cc: Rename: thd->in_multi_stmt_transaction() -> thd->in_multi_stmt_transaction_mode(). Rename: thd->active_transaction() -> thd->in_active_multi_stmt_transaction(). sql/sql_prepare.cc: Rename: thd->in_multi_stmt_transaction() -> thd->in_multi_stmt_transaction_mode(). sql/sql_rename.cc: Rename: thd->active_transaction() -> thd->in_active_multi_stmt_transaction(). sql/sql_table.cc: Rename: thd->active_transaction() -> thd->in_active_multi_stmt_transaction(). sql/sys_vars.cc: Rename: thd->active_transaction() -> thd->in_active_multi_stmt_transaction(). sql/transaction.cc: Rename: thd->in_multi_stmt_transaction() -> thd->in_multi_stmt_transaction_mode(). Rename: thd->active_transaction() -> thd->in_active_multi_stmt_transaction().
This commit is contained in:
parent
b47e4fbf83
commit
9e62cf67b3
15 changed files with 128 additions and 48 deletions
|
@ -197,7 +197,14 @@ enum enum_server_command
|
||||||
& ~CLIENT_COMPRESS) \
|
& ~CLIENT_COMPRESS) \
|
||||||
& ~CLIENT_SSL_VERIFY_SERVER_CERT)
|
& ~CLIENT_SSL_VERIFY_SERVER_CERT)
|
||||||
|
|
||||||
#define SERVER_STATUS_IN_TRANS 1 /* Transaction has started */
|
/**
|
||||||
|
Is raised when a multi-statement transaction
|
||||||
|
has been started, either explicitly, by means
|
||||||
|
of BEGIN or COMMIT AND CHAIN, or
|
||||||
|
implicitly, by the first transactional
|
||||||
|
statement, when autocommit=off.
|
||||||
|
*/
|
||||||
|
#define SERVER_STATUS_IN_TRANS 1
|
||||||
#define SERVER_STATUS_AUTOCOMMIT 2 /* Server in auto_commit mode */
|
#define SERVER_STATUS_AUTOCOMMIT 2 /* Server in auto_commit mode */
|
||||||
#define SERVER_MORE_RESULTS_EXISTS 8 /* Multi query - next query exists */
|
#define SERVER_MORE_RESULTS_EXISTS 8 /* Multi query - next query exists */
|
||||||
#define SERVER_QUERY_NO_GOOD_INDEX_USED 16
|
#define SERVER_QUERY_NO_GOOD_INDEX_USED 16
|
||||||
|
|
|
@ -4628,7 +4628,7 @@ int ha_ndbcluster::start_statement(THD *thd,
|
||||||
trans_register_ha(thd, FALSE, ndbcluster_hton);
|
trans_register_ha(thd, FALSE, ndbcluster_hton);
|
||||||
if (!thd_ndb->trans)
|
if (!thd_ndb->trans)
|
||||||
{
|
{
|
||||||
if (thd->in_multi_stmt_transaction())
|
if (thd->in_multi_stmt_transaction_mode())
|
||||||
trans_register_ha(thd, TRUE, ndbcluster_hton);
|
trans_register_ha(thd, TRUE, ndbcluster_hton);
|
||||||
DBUG_PRINT("trans",("Starting transaction"));
|
DBUG_PRINT("trans",("Starting transaction"));
|
||||||
thd_ndb->trans= ndb->startTransaction();
|
thd_ndb->trans= ndb->startTransaction();
|
||||||
|
@ -4698,7 +4698,7 @@ int ha_ndbcluster::init_handler_for_statement(THD *thd, Thd_ndb *thd_ndb)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (thd->in_multi_stmt_transaction())
|
if (thd->in_multi_stmt_transaction_mode())
|
||||||
{
|
{
|
||||||
const void *key= m_table;
|
const void *key= m_table;
|
||||||
HASH_SEARCH_STATE state;
|
HASH_SEARCH_STATE state;
|
||||||
|
@ -4782,7 +4782,7 @@ int ha_ndbcluster::external_lock(THD *thd, int lock_type)
|
||||||
if (opt_ndb_cache_check_time && m_rows_changed)
|
if (opt_ndb_cache_check_time && m_rows_changed)
|
||||||
{
|
{
|
||||||
DBUG_PRINT("info", ("Rows has changed and util thread is running"));
|
DBUG_PRINT("info", ("Rows has changed and util thread is running"));
|
||||||
if (thd->in_multi_stmt_transaction())
|
if (thd->in_multi_stmt_transaction_mode())
|
||||||
{
|
{
|
||||||
DBUG_PRINT("info", ("Add share to list of tables to be invalidated"));
|
DBUG_PRINT("info", ("Add share to list of tables to be invalidated"));
|
||||||
/* NOTE push_back allocates memory using transactions mem_root! */
|
/* NOTE push_back allocates memory using transactions mem_root! */
|
||||||
|
@ -4801,7 +4801,7 @@ int ha_ndbcluster::external_lock(THD *thd, int lock_type)
|
||||||
DBUG_PRINT("trans", ("Last external_lock"));
|
DBUG_PRINT("trans", ("Last external_lock"));
|
||||||
PRINT_OPTION_FLAGS(thd);
|
PRINT_OPTION_FLAGS(thd);
|
||||||
|
|
||||||
if (!thd->in_multi_stmt_transaction())
|
if (!thd->in_multi_stmt_transaction_mode())
|
||||||
{
|
{
|
||||||
if (thd_ndb->trans)
|
if (thd_ndb->trans)
|
||||||
{
|
{
|
||||||
|
@ -4911,7 +4911,7 @@ static int ndbcluster_commit(handlerton *hton, THD *thd, bool all)
|
||||||
PRINT_OPTION_FLAGS(thd);
|
PRINT_OPTION_FLAGS(thd);
|
||||||
DBUG_PRINT("enter", ("Commit %s", (all ? "all" : "stmt")));
|
DBUG_PRINT("enter", ("Commit %s", (all ? "all" : "stmt")));
|
||||||
thd_ndb->start_stmt_count= 0;
|
thd_ndb->start_stmt_count= 0;
|
||||||
if (trans == NULL || (!all && thd->in_multi_stmt_transaction()))
|
if (trans == NULL || (!all && thd->in_multi_stmt_transaction_mode()))
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
An odditity in the handler interface is that commit on handlerton
|
An odditity in the handler interface is that commit on handlerton
|
||||||
|
@ -4981,7 +4981,7 @@ static int ndbcluster_rollback(handlerton *hton, THD *thd, bool all)
|
||||||
DBUG_ASSERT(ndb);
|
DBUG_ASSERT(ndb);
|
||||||
thd_ndb->start_stmt_count= 0;
|
thd_ndb->start_stmt_count= 0;
|
||||||
if (trans == NULL || (!all &&
|
if (trans == NULL || (!all &&
|
||||||
thd->in_multi_stmt_transaction()))
|
thd->in_multi_stmt_transaction_mode()))
|
||||||
{
|
{
|
||||||
/* Ignore end-of-statement until real rollback or commit is called */
|
/* Ignore end-of-statement until real rollback or commit is called */
|
||||||
DBUG_PRINT("info", ("Rollback before start or end-of-statement only"));
|
DBUG_PRINT("info", ("Rollback before start or end-of-statement only"));
|
||||||
|
@ -8271,7 +8271,7 @@ ndbcluster_cache_retrieval_allowed(THD *thd,
|
||||||
DBUG_ENTER("ndbcluster_cache_retrieval_allowed");
|
DBUG_ENTER("ndbcluster_cache_retrieval_allowed");
|
||||||
DBUG_PRINT("enter", ("dbname: %s, tabname: %s", dbname, tabname));
|
DBUG_PRINT("enter", ("dbname: %s, tabname: %s", dbname, tabname));
|
||||||
|
|
||||||
if (thd->in_multi_stmt_transaction())
|
if (thd->in_multi_stmt_transaction_mode())
|
||||||
{
|
{
|
||||||
DBUG_PRINT("exit", ("No, don't use cache in transaction"));
|
DBUG_PRINT("exit", ("No, don't use cache in transaction"));
|
||||||
DBUG_RETURN(FALSE);
|
DBUG_RETURN(FALSE);
|
||||||
|
@ -8339,7 +8339,7 @@ ha_ndbcluster::register_query_cache_table(THD *thd,
|
||||||
DBUG_ENTER("ha_ndbcluster::register_query_cache_table");
|
DBUG_ENTER("ha_ndbcluster::register_query_cache_table");
|
||||||
DBUG_PRINT("enter",("dbname: %s, tabname: %s", m_dbname, m_tabname));
|
DBUG_PRINT("enter",("dbname: %s, tabname: %s", m_dbname, m_tabname));
|
||||||
|
|
||||||
if (thd->in_multi_stmt_transaction())
|
if (thd->in_multi_stmt_transaction_mode())
|
||||||
{
|
{
|
||||||
DBUG_PRINT("exit", ("Can't register table during transaction"));
|
DBUG_PRINT("exit", ("Can't register table during transaction"));
|
||||||
DBUG_RETURN(FALSE);
|
DBUG_RETURN(FALSE);
|
||||||
|
|
|
@ -1245,7 +1245,14 @@ end:
|
||||||
/**
|
/**
|
||||||
@note
|
@note
|
||||||
This function does not care about global read lock. A caller should.
|
This function does not care about global read lock. A caller should.
|
||||||
|
|
||||||
|
@param[in] all Is set in case of explicit commit
|
||||||
|
(COMMIT statement), or implicit commit
|
||||||
|
issued by DDL. Is not set when called
|
||||||
|
at the end of statement, even if
|
||||||
|
autocommit=1.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int ha_commit_one_phase(THD *thd, bool all)
|
int ha_commit_one_phase(THD *thd, bool all)
|
||||||
{
|
{
|
||||||
int error=0;
|
int error=0;
|
||||||
|
@ -1253,9 +1260,15 @@ int ha_commit_one_phase(THD *thd, bool all)
|
||||||
/*
|
/*
|
||||||
"real" is a nick name for a transaction for which a commit will
|
"real" is a nick name for a transaction for which a commit will
|
||||||
make persistent changes. E.g. a 'stmt' transaction inside a 'all'
|
make persistent changes. E.g. a 'stmt' transaction inside a 'all'
|
||||||
transation is not 'real': even though it's possible to commit it,
|
transaction is not 'real': even though it's possible to commit it,
|
||||||
the changes are not durable as they might be rolled back if the
|
the changes are not durable as they might be rolled back if the
|
||||||
enclosing 'all' transaction is rolled back.
|
enclosing 'all' transaction is rolled back.
|
||||||
|
We establish the value of 'is_real_trans' by checking
|
||||||
|
if it's an explicit COMMIT/BEGIN statement, or implicit
|
||||||
|
commit issued by DDL (all == TRUE), or if we're running
|
||||||
|
in autocommit mode (it's only in the autocommit mode
|
||||||
|
ha_commit_one_phase() can be called with an empty
|
||||||
|
transaction.all.ha_list, see why in trans_register_ha()).
|
||||||
*/
|
*/
|
||||||
bool is_real_trans=all || thd->transaction.all.ha_list == 0;
|
bool is_real_trans=all || thd->transaction.all.ha_list == 0;
|
||||||
Ha_trx_info *ha_info= trans->ha_list, *ha_info_next;
|
Ha_trx_info *ha_info= trans->ha_list, *ha_info_next;
|
||||||
|
@ -1303,9 +1316,15 @@ int ha_rollback_trans(THD *thd, bool all)
|
||||||
/*
|
/*
|
||||||
"real" is a nick name for a transaction for which a commit will
|
"real" is a nick name for a transaction for which a commit will
|
||||||
make persistent changes. E.g. a 'stmt' transaction inside a 'all'
|
make persistent changes. E.g. a 'stmt' transaction inside a 'all'
|
||||||
transation is not 'real': even though it's possible to commit it,
|
transaction is not 'real': even though it's possible to commit it,
|
||||||
the changes are not durable as they might be rolled back if the
|
the changes are not durable as they might be rolled back if the
|
||||||
enclosing 'all' transaction is rolled back.
|
enclosing 'all' transaction is rolled back.
|
||||||
|
We establish the value of 'is_real_trans' by checking
|
||||||
|
if it's an explicit COMMIT or BEGIN statement, or implicit
|
||||||
|
commit issued by DDL (in these cases all == TRUE),
|
||||||
|
or if we're running in autocommit mode (it's only in the autocommit mode
|
||||||
|
ha_commit_one_phase() is called with an empty
|
||||||
|
transaction.all.ha_list, see why in trans_register_ha()).
|
||||||
*/
|
*/
|
||||||
bool is_real_trans=all || thd->transaction.all.ha_list == 0;
|
bool is_real_trans=all || thd->transaction.all.ha_list == 0;
|
||||||
DBUG_ENTER("ha_rollback_trans");
|
DBUG_ENTER("ha_rollback_trans");
|
||||||
|
@ -1358,7 +1377,7 @@ int ha_rollback_trans(THD *thd, bool all)
|
||||||
if (all)
|
if (all)
|
||||||
thd->variables.tx_isolation=thd->session_tx_isolation;
|
thd->variables.tx_isolation=thd->session_tx_isolation;
|
||||||
}
|
}
|
||||||
/* Always cleanup. Even if there nht==0. There may be savepoints. */
|
/* Always cleanup. Even if nht==0. There may be savepoints. */
|
||||||
if (is_real_trans)
|
if (is_real_trans)
|
||||||
thd->transaction.cleanup();
|
thd->transaction.cleanup();
|
||||||
if (all)
|
if (all)
|
||||||
|
|
|
@ -1686,7 +1686,7 @@ static int binlog_commit(handlerton *hton, THD *thd, bool all)
|
||||||
DBUG_PRINT("debug",
|
DBUG_PRINT("debug",
|
||||||
("all: %d, in_transaction: %s, all.modified_non_trans_table: %s, stmt.modified_non_trans_table: %s",
|
("all: %d, in_transaction: %s, all.modified_non_trans_table: %s, stmt.modified_non_trans_table: %s",
|
||||||
all,
|
all,
|
||||||
YESNO(thd->in_multi_stmt_transaction()),
|
YESNO(thd->in_multi_stmt_transaction_mode()),
|
||||||
YESNO(thd->transaction.all.modified_non_trans_table),
|
YESNO(thd->transaction.all.modified_non_trans_table),
|
||||||
YESNO(thd->transaction.stmt.modified_non_trans_table)));
|
YESNO(thd->transaction.stmt.modified_non_trans_table)));
|
||||||
|
|
||||||
|
@ -4267,7 +4267,7 @@ bool use_trans_cache(const THD* thd, bool is_transactional)
|
||||||
*/
|
*/
|
||||||
bool ending_trans(THD* thd, const bool all)
|
bool ending_trans(THD* thd, const bool all)
|
||||||
{
|
{
|
||||||
return (all || (!all && !thd->in_multi_stmt_transaction()));
|
return (all || (!all && !thd->in_multi_stmt_transaction_mode()));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -4370,7 +4370,7 @@ THD::binlog_start_trans_and_stmt()
|
||||||
cache_mngr->trx_cache.get_prev_position() == MY_OFF_T_UNDEF)
|
cache_mngr->trx_cache.get_prev_position() == MY_OFF_T_UNDEF)
|
||||||
{
|
{
|
||||||
this->binlog_set_stmt_begin();
|
this->binlog_set_stmt_begin();
|
||||||
if (in_multi_stmt_transaction())
|
if (in_multi_stmt_transaction_mode())
|
||||||
trans_register_ha(this, TRUE, binlog_hton);
|
trans_register_ha(this, TRUE, binlog_hton);
|
||||||
trans_register_ha(this, FALSE, binlog_hton);
|
trans_register_ha(this, FALSE, binlog_hton);
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -2485,13 +2485,13 @@ Query_log_event::Query_log_event(THD* thd_arg, const char* query_arg,
|
||||||
implicit_commit= TRUE;
|
implicit_commit= TRUE;
|
||||||
break;
|
break;
|
||||||
case SQLCOM_DROP_TABLE:
|
case SQLCOM_DROP_TABLE:
|
||||||
force_trans= lex->drop_temporary && thd->in_multi_stmt_transaction();
|
force_trans= lex->drop_temporary && thd->in_multi_stmt_transaction_mode();
|
||||||
implicit_commit= !force_trans;
|
implicit_commit= !force_trans;
|
||||||
break;
|
break;
|
||||||
case SQLCOM_ALTER_TABLE:
|
case SQLCOM_ALTER_TABLE:
|
||||||
case SQLCOM_CREATE_TABLE:
|
case SQLCOM_CREATE_TABLE:
|
||||||
force_trans= (lex->create_info.options & HA_LEX_CREATE_TMP_TABLE) &&
|
force_trans= (lex->create_info.options & HA_LEX_CREATE_TMP_TABLE) &&
|
||||||
thd->in_multi_stmt_transaction();
|
thd->in_multi_stmt_transaction_mode();
|
||||||
implicit_commit= !force_trans &&
|
implicit_commit= !force_trans &&
|
||||||
!(lex->select_lex.item_list.elements &&
|
!(lex->select_lex.item_list.elements &&
|
||||||
thd->is_current_stmt_binlog_format_row());
|
thd->is_current_stmt_binlog_format_row());
|
||||||
|
|
|
@ -1558,7 +1558,7 @@ void close_thread_tables(THD *thd)
|
||||||
- If in autocommit mode, or outside a transactional context,
|
- If in autocommit mode, or outside a transactional context,
|
||||||
automatically release metadata locks of the current statement.
|
automatically release metadata locks of the current statement.
|
||||||
*/
|
*/
|
||||||
if (! thd->in_multi_stmt_transaction() &&
|
if (! thd->in_multi_stmt_transaction_mode() &&
|
||||||
! (thd->state_flags & Open_tables_state::BACKUPS_AVAIL))
|
! (thd->state_flags & Open_tables_state::BACKUPS_AVAIL))
|
||||||
{
|
{
|
||||||
thd->mdl_context.release_transactional_locks();
|
thd->mdl_context.release_transactional_locks();
|
||||||
|
@ -3783,7 +3783,7 @@ end_with_lock_open:
|
||||||
Open_table_context::Open_table_context(THD *thd, ulong timeout)
|
Open_table_context::Open_table_context(THD *thd, ulong timeout)
|
||||||
:m_action(OT_NO_ACTION),
|
:m_action(OT_NO_ACTION),
|
||||||
m_start_of_statement_svp(thd->mdl_context.mdl_savepoint()),
|
m_start_of_statement_svp(thd->mdl_context.mdl_savepoint()),
|
||||||
m_has_locks((thd->in_multi_stmt_transaction() &&
|
m_has_locks((thd->in_multi_stmt_transaction_mode() &&
|
||||||
thd->mdl_context.has_locks()) ||
|
thd->mdl_context.has_locks()) ||
|
||||||
thd->mdl_context.trans_sentinel()),
|
thd->mdl_context.trans_sentinel()),
|
||||||
m_global_mdl_request(NULL),
|
m_global_mdl_request(NULL),
|
||||||
|
|
|
@ -1177,7 +1177,7 @@ void Query_cache::store_query(THD *thd, TABLE_LIST *tables_used)
|
||||||
DBUG_ASSERT(flags.protocol_type != (unsigned int) Protocol::PROTOCOL_LOCAL);
|
DBUG_ASSERT(flags.protocol_type != (unsigned int) Protocol::PROTOCOL_LOCAL);
|
||||||
flags.more_results_exists= test(thd->server_status &
|
flags.more_results_exists= test(thd->server_status &
|
||||||
SERVER_MORE_RESULTS_EXISTS);
|
SERVER_MORE_RESULTS_EXISTS);
|
||||||
flags.in_trans= test(thd->server_status & SERVER_STATUS_IN_TRANS);
|
flags.in_trans= thd->in_active_multi_stmt_transaction();
|
||||||
flags.autocommit= test(thd->server_status & SERVER_STATUS_AUTOCOMMIT);
|
flags.autocommit= test(thd->server_status & SERVER_STATUS_AUTOCOMMIT);
|
||||||
flags.pkt_nr= net->pkt_nr;
|
flags.pkt_nr= net->pkt_nr;
|
||||||
flags.character_set_client_num=
|
flags.character_set_client_num=
|
||||||
|
@ -1470,7 +1470,7 @@ Query_cache::send_result_to_client(THD *thd, char *sql, uint query_length)
|
||||||
flags.protocol_type= (unsigned int) thd->protocol->type();
|
flags.protocol_type= (unsigned int) thd->protocol->type();
|
||||||
flags.more_results_exists= test(thd->server_status &
|
flags.more_results_exists= test(thd->server_status &
|
||||||
SERVER_MORE_RESULTS_EXISTS);
|
SERVER_MORE_RESULTS_EXISTS);
|
||||||
flags.in_trans= test(thd->server_status & SERVER_STATUS_IN_TRANS);
|
flags.in_trans= thd->in_active_multi_stmt_transaction();
|
||||||
flags.autocommit= test(thd->server_status & SERVER_STATUS_AUTOCOMMIT);
|
flags.autocommit= test(thd->server_status & SERVER_STATUS_AUTOCOMMIT);
|
||||||
flags.pkt_nr= thd->net.pkt_nr;
|
flags.pkt_nr= thd->net.pkt_nr;
|
||||||
flags.character_set_client_num= thd->variables.character_set_client->number;
|
flags.character_set_client_num= thd->variables.character_set_client->number;
|
||||||
|
@ -1541,7 +1541,7 @@ def_week_frmt: %lu, in_trans: %d, autocommit: %d",
|
||||||
}
|
}
|
||||||
DBUG_PRINT("qcache", ("Query have result 0x%lx", (ulong) query));
|
DBUG_PRINT("qcache", ("Query have result 0x%lx", (ulong) query));
|
||||||
|
|
||||||
if (thd->in_multi_stmt_transaction() &&
|
if (thd->in_multi_stmt_transaction_mode() &&
|
||||||
(query->tables_type() & HA_CACHE_TBL_TRANSACT))
|
(query->tables_type() & HA_CACHE_TBL_TRANSACT))
|
||||||
{
|
{
|
||||||
DBUG_PRINT("qcache",
|
DBUG_PRINT("qcache",
|
||||||
|
@ -1698,7 +1698,7 @@ void Query_cache::invalidate(THD *thd, TABLE_LIST *tables_used,
|
||||||
if (is_disabled())
|
if (is_disabled())
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
|
|
||||||
using_transactions= using_transactions && thd->in_multi_stmt_transaction();
|
using_transactions= using_transactions && thd->in_multi_stmt_transaction_mode();
|
||||||
for (; tables_used; tables_used= tables_used->next_local)
|
for (; tables_used; tables_used= tables_used->next_local)
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(!using_transactions || tables_used->table!=0);
|
DBUG_ASSERT(!using_transactions || tables_used->table!=0);
|
||||||
|
@ -1782,7 +1782,7 @@ void Query_cache::invalidate(THD *thd, TABLE *table,
|
||||||
if (is_disabled())
|
if (is_disabled())
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
|
|
||||||
using_transactions= using_transactions && thd->in_multi_stmt_transaction();
|
using_transactions= using_transactions && thd->in_multi_stmt_transaction_mode();
|
||||||
if (using_transactions &&
|
if (using_transactions &&
|
||||||
(table->file->table_cache_type() == HA_CACHE_TBL_TRANSACT))
|
(table->file->table_cache_type() == HA_CACHE_TBL_TRANSACT))
|
||||||
thd->add_changed_table(table);
|
thd->add_changed_table(table);
|
||||||
|
@ -1800,7 +1800,7 @@ void Query_cache::invalidate(THD *thd, const char *key, uint32 key_length,
|
||||||
if (is_disabled())
|
if (is_disabled())
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
|
|
||||||
using_transactions= using_transactions && thd->in_multi_stmt_transaction();
|
using_transactions= using_transactions && thd->in_multi_stmt_transaction_mode();
|
||||||
if (using_transactions) // used for innodb => has_transactions() is TRUE
|
if (using_transactions) // used for innodb => has_transactions() is TRUE
|
||||||
thd->add_changed_table(key, key_length);
|
thd->add_changed_table(key, key_length);
|
||||||
else
|
else
|
||||||
|
@ -3572,7 +3572,7 @@ Query_cache::is_cacheable(THD *thd, size_t query_len, const char *query,
|
||||||
tables_type)))
|
tables_type)))
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
|
|
||||||
if (thd->in_multi_stmt_transaction() &&
|
if (thd->in_multi_stmt_transaction_mode() &&
|
||||||
((*tables_type)&HA_CACHE_TBL_TRANSACT))
|
((*tables_type)&HA_CACHE_TBL_TRANSACT))
|
||||||
{
|
{
|
||||||
DBUG_PRINT("qcache", ("not in autocommin mode"));
|
DBUG_PRINT("qcache", ("not in autocommin mode"));
|
||||||
|
|
|
@ -1440,7 +1440,7 @@ void THD::add_changed_table(TABLE *table)
|
||||||
{
|
{
|
||||||
DBUG_ENTER("THD::add_changed_table(table)");
|
DBUG_ENTER("THD::add_changed_table(table)");
|
||||||
|
|
||||||
DBUG_ASSERT(in_multi_stmt_transaction() && table->file->has_transactions());
|
DBUG_ASSERT(in_multi_stmt_transaction_mode() && table->file->has_transactions());
|
||||||
add_changed_table(table->s->table_cache_key.str,
|
add_changed_table(table->s->table_cache_key.str,
|
||||||
(long) table->s->table_cache_key.length);
|
(long) table->s->table_cache_key.length);
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
|
|
|
@ -2309,10 +2309,6 @@ public:
|
||||||
{
|
{
|
||||||
return limit_found_rows;
|
return limit_found_rows;
|
||||||
}
|
}
|
||||||
inline bool active_transaction()
|
|
||||||
{
|
|
||||||
return server_status & SERVER_STATUS_IN_TRANS;
|
|
||||||
}
|
|
||||||
/**
|
/**
|
||||||
Returns TRUE if session is in a multi-statement transaction mode.
|
Returns TRUE if session is in a multi-statement transaction mode.
|
||||||
|
|
||||||
|
@ -2323,11 +2319,60 @@ public:
|
||||||
OPTION_BEGIN: Regardless of the autocommit status, a multi-statement
|
OPTION_BEGIN: Regardless of the autocommit status, a multi-statement
|
||||||
transaction can be explicitly started with the statements "START
|
transaction can be explicitly started with the statements "START
|
||||||
TRANSACTION", "BEGIN [WORK]", "[COMMIT | ROLLBACK] AND CHAIN", etc.
|
TRANSACTION", "BEGIN [WORK]", "[COMMIT | ROLLBACK] AND CHAIN", etc.
|
||||||
|
|
||||||
|
Note: this doesn't tell you whether a transaction is active.
|
||||||
|
A session can be in multi-statement transaction mode, and yet
|
||||||
|
have no active transaction, e.g., in case of:
|
||||||
|
set @@autocommit=0;
|
||||||
|
set @a= 3; <-- these statements don't
|
||||||
|
set transaction isolation level serializable; <-- start an active
|
||||||
|
flush tables; <-- transaction
|
||||||
|
|
||||||
|
I.e. for the above scenario this function returns TRUE, even
|
||||||
|
though no active transaction has begun.
|
||||||
|
@sa in_active_multi_stmt_transaction()
|
||||||
*/
|
*/
|
||||||
inline bool in_multi_stmt_transaction()
|
inline bool in_multi_stmt_transaction_mode()
|
||||||
{
|
{
|
||||||
return variables.option_bits & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN);
|
return variables.option_bits & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN);
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
TRUE if the session is in a multi-statement transaction mode
|
||||||
|
(@sa in_multi_stmt_transaction_mode()) *and* there is an
|
||||||
|
active transaction, i.e. there is an explicit start of a
|
||||||
|
transaction with BEGIN statement, or implicit with a
|
||||||
|
statement that uses a transactional engine.
|
||||||
|
|
||||||
|
For example, these scenarios don't start an active transaction
|
||||||
|
(even though the server is in multi-statement transaction mode):
|
||||||
|
|
||||||
|
set @@autocommit=0;
|
||||||
|
select * from nontrans_table;
|
||||||
|
set @var=TRUE;
|
||||||
|
flush tables;
|
||||||
|
|
||||||
|
Note, that even for a statement that starts a multi-statement
|
||||||
|
transaction (i.e. select * from trans_table), this
|
||||||
|
flag won't be set until we open the statement's tables
|
||||||
|
and the engines register themselves for the transaction
|
||||||
|
(see trans_register_ha()),
|
||||||
|
hence this method is reliable to use only after
|
||||||
|
open_tables() has completed.
|
||||||
|
|
||||||
|
Why do we need a flag?
|
||||||
|
----------------------
|
||||||
|
We need to maintain a (at first glance redundant)
|
||||||
|
session flag, rather than looking at thd->transaction.all.ha_list
|
||||||
|
because of explicit start of a transaction with BEGIN.
|
||||||
|
|
||||||
|
I.e. in case of
|
||||||
|
BEGIN;
|
||||||
|
select * from nontrans_t1; <-- in_active_multi_stmt_transaction() is true
|
||||||
|
*/
|
||||||
|
inline bool in_active_multi_stmt_transaction()
|
||||||
|
{
|
||||||
|
return server_status & SERVER_STATUS_IN_TRANS;
|
||||||
|
}
|
||||||
inline bool fill_derived_tables()
|
inline bool fill_derived_tables()
|
||||||
{
|
{
|
||||||
return !stmt_arena->is_stmt_prepare() && !lex->only_view_structure();
|
return !stmt_arena->is_stmt_prepare() && !lex->only_view_structure();
|
||||||
|
|
|
@ -2765,7 +2765,7 @@ end_with_restore_list:
|
||||||
client thread has locked tables
|
client thread has locked tables
|
||||||
*/
|
*/
|
||||||
if (thd->locked_tables_mode ||
|
if (thd->locked_tables_mode ||
|
||||||
thd->active_transaction() || thd->global_read_lock.is_acquired())
|
thd->in_active_multi_stmt_transaction() || thd->global_read_lock.is_acquired())
|
||||||
{
|
{
|
||||||
my_message(ER_LOCK_OR_ACTIVE_TRANSACTION,
|
my_message(ER_LOCK_OR_ACTIVE_TRANSACTION,
|
||||||
ER(ER_LOCK_OR_ACTIVE_TRANSACTION), MYF(0));
|
ER(ER_LOCK_OR_ACTIVE_TRANSACTION), MYF(0));
|
||||||
|
@ -3273,7 +3273,7 @@ end_with_restore_list:
|
||||||
Don't allow this within a transaction because we want to use
|
Don't allow this within a transaction because we want to use
|
||||||
re-generate table
|
re-generate table
|
||||||
*/
|
*/
|
||||||
if (thd->active_transaction())
|
if (thd->in_active_multi_stmt_transaction())
|
||||||
{
|
{
|
||||||
my_message(ER_LOCK_OR_ACTIVE_TRANSACTION,
|
my_message(ER_LOCK_OR_ACTIVE_TRANSACTION,
|
||||||
ER(ER_LOCK_OR_ACTIVE_TRANSACTION), MYF(0));
|
ER(ER_LOCK_OR_ACTIVE_TRANSACTION), MYF(0));
|
||||||
|
@ -4711,6 +4711,9 @@ finish:
|
||||||
thd->global_read_lock.start_waiting_global_read_lock(thd);
|
thd->global_read_lock.start_waiting_global_read_lock(thd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DBUG_ASSERT(!thd->in_active_multi_stmt_transaction() ||
|
||||||
|
thd->in_multi_stmt_transaction_mode());
|
||||||
|
|
||||||
if (stmt_causes_implicit_commit(thd, CF_IMPLICIT_COMMIT_END))
|
if (stmt_causes_implicit_commit(thd, CF_IMPLICIT_COMMIT_END))
|
||||||
{
|
{
|
||||||
/* If commit fails, we should be able to reset the OK status. */
|
/* If commit fails, we should be able to reset the OK status. */
|
||||||
|
@ -5524,7 +5527,7 @@ void THD::reset_for_next_command()
|
||||||
OPTION_STATUS_NO_TRANS_UPDATE | OPTION_KEEP_LOG to not get warnings
|
OPTION_STATUS_NO_TRANS_UPDATE | OPTION_KEEP_LOG to not get warnings
|
||||||
in ha_rollback_trans() about some tables couldn't be rolled back.
|
in ha_rollback_trans() about some tables couldn't be rolled back.
|
||||||
*/
|
*/
|
||||||
if (!thd->in_multi_stmt_transaction())
|
if (!thd->in_multi_stmt_transaction_mode())
|
||||||
{
|
{
|
||||||
thd->variables.option_bits&= ~OPTION_KEEP_LOG;
|
thd->variables.option_bits&= ~OPTION_KEEP_LOG;
|
||||||
thd->transaction.all.modified_non_trans_table= FALSE;
|
thd->transaction.all.modified_non_trans_table= FALSE;
|
||||||
|
|
|
@ -3246,7 +3246,7 @@ bool Prepared_statement::prepare(const char *packet, uint packet_len)
|
||||||
locks have already been released and our savepoint points
|
locks have already been released and our savepoint points
|
||||||
to ticket which has been released as well.
|
to ticket which has been released as well.
|
||||||
*/
|
*/
|
||||||
if (thd->in_multi_stmt_transaction())
|
if (thd->in_multi_stmt_transaction_mode())
|
||||||
thd->mdl_context.rollback_to_savepoint(mdl_savepoint);
|
thd->mdl_context.rollback_to_savepoint(mdl_savepoint);
|
||||||
thd->restore_backup_statement(this, &stmt_backup);
|
thd->restore_backup_statement(this, &stmt_backup);
|
||||||
thd->stmt_arena= old_stmt_arena;
|
thd->stmt_arena= old_stmt_arena;
|
||||||
|
|
|
@ -54,7 +54,7 @@ bool mysql_rename_tables(THD *thd, TABLE_LIST *table_list, bool silent)
|
||||||
if the user is trying to to do this in a transcation context
|
if the user is trying to to do this in a transcation context
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (thd->locked_tables_mode || thd->active_transaction())
|
if (thd->locked_tables_mode || thd->in_active_multi_stmt_transaction())
|
||||||
{
|
{
|
||||||
my_message(ER_LOCK_OR_ACTIVE_TRANSACTION,
|
my_message(ER_LOCK_OR_ACTIVE_TRANSACTION,
|
||||||
ER(ER_LOCK_OR_ACTIVE_TRANSACTION), MYF(0));
|
ER(ER_LOCK_OR_ACTIVE_TRANSACTION), MYF(0));
|
||||||
|
|
|
@ -6559,7 +6559,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
|
||||||
if the user is trying to to do this in a transcation context
|
if the user is trying to to do this in a transcation context
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (thd->locked_tables_mode || thd->active_transaction())
|
if (thd->locked_tables_mode || thd->in_active_multi_stmt_transaction())
|
||||||
{
|
{
|
||||||
my_message(ER_LOCK_OR_ACTIVE_TRANSACTION,
|
my_message(ER_LOCK_OR_ACTIVE_TRANSACTION,
|
||||||
ER(ER_LOCK_OR_ACTIVE_TRANSACTION), MYF(0));
|
ER(ER_LOCK_OR_ACTIVE_TRANSACTION), MYF(0));
|
||||||
|
|
|
@ -295,7 +295,7 @@ static bool binlog_format_check(sys_var *self, THD *thd, set_var *var)
|
||||||
/*
|
/*
|
||||||
Make the session variable 'binlog_format' read-only inside a transaction.
|
Make the session variable 'binlog_format' read-only inside a transaction.
|
||||||
*/
|
*/
|
||||||
if (thd->active_transaction())
|
if (thd->in_active_multi_stmt_transaction())
|
||||||
{
|
{
|
||||||
my_error(ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT, MYF(0));
|
my_error(ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT, MYF(0));
|
||||||
return true;
|
return true;
|
||||||
|
@ -348,7 +348,7 @@ static bool binlog_direct_check(sys_var *self, THD *thd, set_var *var)
|
||||||
Makes the session variable 'binlog_direct_non_transactional_updates'
|
Makes the session variable 'binlog_direct_non_transactional_updates'
|
||||||
read-only inside a transaction.
|
read-only inside a transaction.
|
||||||
*/
|
*/
|
||||||
if (thd->active_transaction())
|
if (thd->in_active_multi_stmt_transaction())
|
||||||
{
|
{
|
||||||
my_error(ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_DIRECT, MYF(0));
|
my_error(ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_DIRECT, MYF(0));
|
||||||
return true;
|
return true;
|
||||||
|
@ -1428,7 +1428,7 @@ static my_bool read_only;
|
||||||
static bool check_read_only(sys_var *self, THD *thd, set_var *var)
|
static bool check_read_only(sys_var *self, THD *thd, set_var *var)
|
||||||
{
|
{
|
||||||
/* Prevent self dead-lock */
|
/* Prevent self dead-lock */
|
||||||
if (thd->locked_tables_mode || thd->active_transaction())
|
if (thd->locked_tables_mode || thd->in_active_multi_stmt_transaction())
|
||||||
{
|
{
|
||||||
my_error(ER_LOCK_OR_ACTIVE_TRANSACTION, MYF(0));
|
my_error(ER_LOCK_OR_ACTIVE_TRANSACTION, MYF(0));
|
||||||
return true;
|
return true;
|
||||||
|
@ -2006,15 +2006,20 @@ static Sys_var_ulong Sys_thread_pool_size(
|
||||||
VALID_RANGE(1, 16384), DEFAULT(20), BLOCK_SIZE(0));
|
VALID_RANGE(1, 16384), DEFAULT(20), BLOCK_SIZE(0));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Can't change the 'next' tx_isolation if we are already in a transaction
|
/**
|
||||||
|
Can't change the 'next' tx_isolation if we are already in a
|
||||||
|
transaction.
|
||||||
|
*/
|
||||||
|
|
||||||
static bool check_tx_isolation(sys_var *self, THD *thd, set_var *var)
|
static bool check_tx_isolation(sys_var *self, THD *thd, set_var *var)
|
||||||
{
|
{
|
||||||
if (var->type == OPT_DEFAULT && (thd->server_status & SERVER_STATUS_IN_TRANS))
|
if (var->type == OPT_DEFAULT && thd->in_active_multi_stmt_transaction())
|
||||||
{
|
{
|
||||||
|
DBUG_ASSERT(thd->in_multi_stmt_transaction_mode());
|
||||||
my_error(ER_CANT_CHANGE_TX_ISOLATION, MYF(0));
|
my_error(ER_CANT_CHANGE_TX_ISOLATION, MYF(0));
|
||||||
return true;
|
return TRUE;
|
||||||
}
|
}
|
||||||
return false;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -2027,6 +2032,7 @@ static bool fix_tx_isolation(sys_var *self, THD *thd, enum_var_type type)
|
||||||
thd->session_tx_isolation= (enum_tx_isolation)thd->variables.tx_isolation;
|
thd->session_tx_isolation= (enum_tx_isolation)thd->variables.tx_isolation;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// NO_CMD_LINE - different name of the option
|
// NO_CMD_LINE - different name of the option
|
||||||
static Sys_var_enum Sys_tx_isolation(
|
static Sys_var_enum Sys_tx_isolation(
|
||||||
"tx_isolation", "Default transaction isolation level",
|
"tx_isolation", "Default transaction isolation level",
|
||||||
|
|
|
@ -169,7 +169,7 @@ bool trans_commit_implicit(THD *thd)
|
||||||
if (trans_check(thd))
|
if (trans_check(thd))
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
|
|
||||||
if (thd->in_multi_stmt_transaction() ||
|
if (thd->in_multi_stmt_transaction_mode() ||
|
||||||
(thd->variables.option_bits & OPTION_TABLE_LOCK))
|
(thd->variables.option_bits & OPTION_TABLE_LOCK))
|
||||||
{
|
{
|
||||||
/* Safety if one did "drop table" on locked tables */
|
/* Safety if one did "drop table" on locked tables */
|
||||||
|
@ -305,7 +305,7 @@ bool trans_savepoint(THD *thd, LEX_STRING name)
|
||||||
SAVEPOINT **sv, *newsv;
|
SAVEPOINT **sv, *newsv;
|
||||||
DBUG_ENTER("trans_savepoint");
|
DBUG_ENTER("trans_savepoint");
|
||||||
|
|
||||||
if (!(thd->in_multi_stmt_transaction() || thd->in_sub_stmt) ||
|
if (!(thd->in_multi_stmt_transaction_mode() || thd->in_sub_stmt) ||
|
||||||
!opt_using_transactions)
|
!opt_using_transactions)
|
||||||
DBUG_RETURN(FALSE);
|
DBUG_RETURN(FALSE);
|
||||||
|
|
||||||
|
@ -467,7 +467,7 @@ bool trans_xa_start(THD *thd)
|
||||||
my_error(ER_XAER_INVAL, MYF(0));
|
my_error(ER_XAER_INVAL, MYF(0));
|
||||||
else if (xa_state != XA_NOTR)
|
else if (xa_state != XA_NOTR)
|
||||||
my_error(ER_XAER_RMFAIL, MYF(0), xa_state_names[xa_state]);
|
my_error(ER_XAER_RMFAIL, MYF(0), xa_state_names[xa_state]);
|
||||||
else if (thd->locked_tables_mode || thd->active_transaction())
|
else if (thd->locked_tables_mode || thd->in_active_multi_stmt_transaction())
|
||||||
my_error(ER_XAER_OUTSIDE, MYF(0));
|
my_error(ER_XAER_OUTSIDE, MYF(0));
|
||||||
else if (xid_cache_search(thd->lex->xid))
|
else if (xid_cache_search(thd->lex->xid))
|
||||||
my_error(ER_XAER_DUPID, MYF(0));
|
my_error(ER_XAER_DUPID, MYF(0));
|
||||||
|
|
Loading…
Reference in a new issue