/**********************************************************************//** Does the transaction commit for MySQL. @return DB_SUCCESS or error number */ UNIV_INTERN ulint trx_commit_for_mysql( /*=================*/ trx_t* trx) /*!< in: trx handle */ { /* Because we do not do the commit by sending an Innobase sig to the transaction, we must here make sure that trx has been started. */ ut_a(trx); trx_start_if_not_started(trx); trx->op_info = "committing"; mutex_enter(&kernel_mutex); trx_commit_off_kernel(trx); mutex_exit(&kernel_mutex); trx->op_info = ""; return(DB_SUCCESS); }
ulint trx_commit_for_mysql( /*=================*/ /* out: 0 or error number */ trx_t* trx) /* in: trx handle */ { /* Because we do not do the commit by sending an Innobase sig to the transaction, we must here make sure that trx has been started. */ ut_a(trx); trx->op_info = "committing"; /* If we are doing the XA recovery of prepared transactions, then the transaction object does not have an InnoDB session object, and we set the dummy session that we use for all MySQL transactions. */ if (trx->sess == NULL) { /* Open a dummy session */ if (!trx_dummy_sess) { mutex_enter(&kernel_mutex); if (!trx_dummy_sess) { trx_dummy_sess = sess_open(); } mutex_exit(&kernel_mutex); } trx->sess = trx_dummy_sess; } trx_start_if_not_started(trx); mutex_enter(&kernel_mutex); trx_commit_off_kernel(trx); mutex_exit(&kernel_mutex); trx->op_info = ""; return(0); }
/****************************************************************//** Commits a transaction. NOTE that the kernel mutex is temporarily released. */ static void trx_handle_commit_sig_off_kernel( /*=============================*/ trx_t* trx, /*!< in: transaction */ que_thr_t** next_thr) /*!< in/out: next query thread to run; if the value which is passed in is a pointer to a NULL pointer, then the calling function can start running a new query thread */ { trx_sig_t* sig; trx_sig_t* next_sig; ut_ad(mutex_own(&kernel_mutex)); trx->que_state = TRX_QUE_COMMITTING; trx_commit_off_kernel(trx); ut_ad(UT_LIST_GET_LEN(trx->wait_thrs) == 0); /* Remove all TRX_SIG_COMMIT signals from the signal queue and send reply messages to them */ sig = UT_LIST_GET_FIRST(trx->signals); while (sig != NULL) { next_sig = UT_LIST_GET_NEXT(signals, sig); if (sig->type == TRX_SIG_COMMIT) { trx_sig_reply(sig, next_thr); trx_sig_remove(trx, sig); } sig = next_sig; } trx->que_state = TRX_QUE_RUNNING; }