MySQL 9.1.0
Source Code Documentation
Sql_cmd_xa_second_phase Class Reference

This class abstracts some functionality used by XA statements involved in the second phase of the the XA two-phase commit, specifically, XA COMMIT and XA ROLLBACK SQL statements. More...

#include <sql_xa_second_phase.h>

Inheritance diagram for Sql_cmd_xa_second_phase:
[legend]

Public Member Functions

 Sql_cmd_xa_second_phase (xid_t *xid_arg)
 Class constructor. More...
 
virtual ~Sql_cmd_xa_second_phase () override=default
 
- Public Member Functions inherited from Sql_cmd
virtual enum_sql_command sql_command_code () const =0
 Return the command code for this statement. More...
 
bool needs_explicit_preparation () const
 
bool is_regular () const
 
bool is_prepared () const
 
virtual bool prepare (THD *)
 Prepare this SQL statement. More...
 
virtual bool execute (THD *thd)=0
 Execute this SQL statement. More...
 
virtual bool reprepare_on_execute_required () const
 Some SQL commands currently require re-preparation on re-execution of a prepared statement or stored procedure. More...
 
virtual void cleanup (THD *)
 Command-specific reinitialization before execution of prepared statement. More...
 
void set_owner (Prepared_statement *stmt)
 Set the owning prepared statement. More...
 
Prepared_statementowner () const
 Get the owning prepared statement. More...
 
void set_as_part_of_sp ()
 Mark statement as part of procedure. More...
 
bool is_part_of_sp () const
 
virtual enum enum_sql_cmd_type sql_cmd_type () const
 
virtual bool is_single_table_plan () const
 
virtual bool accept (THD *, Select_lex_visitor *)
 
virtual const MYSQL_LEX_CSTRINGeligible_secondary_storage_engine (THD *) const
 Is this statement of a type and on a form that makes it eligible for execution in a secondary storage engine? More...
 
virtual bool is_bulk_load () const
 
virtual bool are_dynamic_parameters_allowed () const
 
void disable_secondary_storage_engine ()
 Disable use of secondary storage engines in this statement. More...
 
void enable_secondary_storage_engine ()
 
bool secondary_storage_engine_disabled () const
 Has use of secondary storage engines been disabled for this statement? More...
 
void use_secondary_storage_engine (const handlerton *hton)
 Mark the current statement as using a secondary storage engine. More...
 
bool using_secondary_storage_engine () const
 Is this statement using a secondary storage engine? More...
 
const handlertonsecondary_engine () const
 Get the handlerton of the secondary engine that is used for executing this statement, or nullptr if a secondary engine is not used. More...
 
void set_optional_transform_prepared (bool value)
 
bool is_optional_transform_prepared ()
 

Protected Member Functions

bool find_and_initialize_xa_context (THD *thd)
 Tries to find and initialize the Transaction_ctx for the underlying detached XA transaction. More...
 
bool acquire_locks (THD *thd)
 Tries to acquire the locks necessary to finalize the underlying detached XA transaction. More...
 
void release_locks () const
 Release any locks acquires in acquire_locks still needing to be released. More...
 
void setup_thd_context (THD *thd)
 Initializes the necessary parts of the thd parameter, transferring some of the detached XA transaction context to the active session. More...
 
bool enter_commit_order (THD *thd)
 For replica applier threads, enters the wait on the commit order. More...
 
void assign_xid_to_thd (THD *thd) const
 Sets the XID_STATE of the THD session object parameter as in detached state and copies into it the XID of the detached XA transaction. More...
 
void exit_commit_order (THD *thd) const
 For replica applier threads, finishes the wait on the commit order and allows other threads to proceed. More...
 
void cleanup_context (THD *thd) const
 Cleans up the THD context in order to prepare it for re-use. More...
 
void dispose ()
 Disposes of member variables that need it, because destructors for Sql_cmd classes aren't invoked (since they are created in the internal memory pool, memory is disposed as a all block). More...
 
- Protected Member Functions inherited from Sql_cmd
 Sql_cmd ()
 
virtual ~Sql_cmd ()
 
void set_prepared ()
 Set this statement as prepared. More...
 

Protected Attributes

xid_tm_xid {nullptr}
 The XID associated with the underlying XA transaction. More...
 
MDL_savepoint m_mdl_savepoint
 The MDL savepoint used to rollback the MDL context when transient errors occur. More...
 
std::shared_ptr< Transaction_ctxm_detached_trx_context {nullptr}
 The detached transaction context, retrieved from the transaction cache. More...
 
bool m_gtid_error {false}
 Whether or not the initialization of GTIDs returned an error. More...
 
bool m_need_clear_owned_gtid {false}
 Whether or not the OWNED_GTID related structures need to be cleaned. More...
 
bool m_result {false}
 The incremental success of the several initialization and deinitialization steps. More...
 

Detailed Description

This class abstracts some functionality used by XA statements involved in the second phase of the the XA two-phase commit, specifically, XA COMMIT and XA ROLLBACK SQL statements.

Common usage of the available methods target the process of detached XA transactions, code pattern looks like:

bool Sql_cmd_xa_statement::process_detached_xa_statement(THD *thd) {
  DBUG_TRACE;

  if (this->find_and_initialize_xa_context(thd)) return true;
  if (this->acquire_locks(thd)) return true;
  raii::Sentry<> xa_lock_guard{
      [this]() -> void { this->release_locks(); }};
  this->setup_thd_context(thd);
  if (this->enter_commit_order(thd)) return true;

  this->assign_xid_to_thd(thd);

SPECIFIC STATEMENT EXECUTION HERE this->m_result = exec_statement(thd);

this->exit_commit_order(thd); this->cleanup_context(thd);

return this->m_result; }

See also
Sql_cmd

Constructor & Destructor Documentation

◆ Sql_cmd_xa_second_phase()

Sql_cmd_xa_second_phase::Sql_cmd_xa_second_phase ( xid_t xid_arg)

Class constructor.

Parameters
xid_argXID of the XA transacation about to be committed

◆ ~Sql_cmd_xa_second_phase()

virtual Sql_cmd_xa_second_phase::~Sql_cmd_xa_second_phase ( )
overridevirtualdefault

Member Function Documentation

◆ acquire_locks()

bool Sql_cmd_xa_second_phase::acquire_locks ( THD thd)
protected

Tries to acquire the locks necessary to finalize the underlying detached XA transaction.

By function exit, all locks have been acquired or none.

Execution is as follows:

  1. An MDL savepoint is set, in order to allow the rollback to this point if a timeout/locking error is triggered.
  2. XID_STATE::m_xa_lock is acquired to prevent concurrent finalization of the transaction (triggered from different client connections, for instance).
  3. Ensure that between steps 1. and 2. some other session didn't finalize the transaction, by confirming that the transaction is in the transaction cache and still in prepared state.
  4. Acquire MDL commit locks.
Parameters
thdThe THD session object used to process the detached XA transaction.
Returns
false if all necessary locks were acquired, true otherwise.

◆ assign_xid_to_thd()

void Sql_cmd_xa_second_phase::assign_xid_to_thd ( THD thd) const
protected

Sets the XID_STATE of the THD session object parameter as in detached state and copies into it the XID of the detached XA transaction.

Parameters
thdThe THD session object used to process the detached XA transaction.

◆ cleanup_context()

void Sql_cmd_xa_second_phase::cleanup_context ( THD thd) const
protected

Cleans up the THD context in order to prepare it for re-use.

Execution is as follows:

  1. The active THD session binlogging state is cleared.
  2. Any MDL context backup, associated with the detached transaction, is deleted.
  3. The detached transaction context is deleted from the transaction cache.
  4. GTID state is finalized, either committing or rolling back the GTID information.
Parameters
thdThe THD session object used to process the detached XA transaction.

◆ dispose()

void Sql_cmd_xa_second_phase::dispose ( )
protected

Disposes of member variables that need it, because destructors for Sql_cmd classes aren't invoked (since they are created in the internal memory pool, memory is disposed as a all block).

◆ enter_commit_order()

bool Sql_cmd_xa_second_phase::enter_commit_order ( THD thd)
protected

For replica applier threads, enters the wait on the commit order.

Execution is as follows:

  1. Enters the wait on the commit order.
  2. If the wait fails (timeout or possible deadlock found), resets the overall state to a point where a retry is possible: a. Resets the GTID infra-structure. b. Rolls back the MDL context to the recorded savepoint. c. Resets the transaction binlogging state.
Parameters
thdThe THD session object used to process the detached XA transaction.
Returns
false if the commit order wait was successful, true otherwise.

◆ exit_commit_order()

void Sql_cmd_xa_second_phase::exit_commit_order ( THD thd) const
protected

For replica applier threads, finishes the wait on the commit order and allows other threads to proceed.

Parameters
thdThe THD session object used to process the detached XA transaction.

◆ find_and_initialize_xa_context()

bool Sql_cmd_xa_second_phase::find_and_initialize_xa_context ( THD thd)
protected

Tries to find and initialize the Transaction_ctx for the underlying detached XA transaction.

Execution is as follows:

  1. Find transaction in the transaction cache.
  2. Ensure that the underlying state regards the detached XA transaction.
Parameters
thdThe THD session object used to process the detached XA transaction.
Returns
false if the transaction context was successfully initialized, true otherwise.

◆ release_locks()

void Sql_cmd_xa_second_phase::release_locks ( ) const
protected

Release any locks acquires in acquire_locks still needing to be released.

◆ setup_thd_context()

void Sql_cmd_xa_second_phase::setup_thd_context ( THD thd)
protected

Initializes the necessary parts of the thd parameter, transferring some of the detached XA transaction context to the active session.

This is necessary to use other parts of the infra-structure that rely on having the active THD session properly initialized.

Execution is as follows:

  1. Determine if GTID infra-structure is consistent and ready to finalize the transaction.
  2. Check the detached transaction status.
  3. Transfer to the THD session object the state of the detached XA transaction w.r.t whether or not the transaction has already been binlogged.
Parameters
thdThe THD session object used to process the detached XA transaction.

Member Data Documentation

◆ m_detached_trx_context

std::shared_ptr<Transaction_ctx> Sql_cmd_xa_second_phase::m_detached_trx_context {nullptr}
protected

The detached transaction context, retrieved from the transaction cache.

◆ m_gtid_error

bool Sql_cmd_xa_second_phase::m_gtid_error {false}
protected

Whether or not the initialization of GTIDs returned an error.

◆ m_mdl_savepoint

MDL_savepoint Sql_cmd_xa_second_phase::m_mdl_savepoint
protected

The MDL savepoint used to rollback the MDL context when transient errors occur.

◆ m_need_clear_owned_gtid

bool Sql_cmd_xa_second_phase::m_need_clear_owned_gtid {false}
protected

Whether or not the OWNED_GTID related structures need to be cleaned.

◆ m_result

bool Sql_cmd_xa_second_phase::m_result {false}
protected

The incremental success of the several initialization and deinitialization steps.

Is mainly used to steer some of the deinitialization calls

◆ m_xid

xid_t* Sql_cmd_xa_second_phase::m_xid {nullptr}
protected

The XID associated with the underlying XA transaction.


The documentation for this class was generated from the following files: