summaryrefslogtreecommitdiff
path: root/sql/log.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/log.cc')
-rw-r--r--sql/log.cc18
1 files changed, 14 insertions, 4 deletions
diff --git a/sql/log.cc b/sql/log.cc
index a92b180a9a7..daee879d7db 100644
--- a/sql/log.cc
+++ b/sql/log.cc
@@ -2177,9 +2177,19 @@ static int binlog_commit(handlerton *hton, THD *thd, bool all)
*/
if (likely(!error) && ending_trans(thd, all))
{
- error= is_preparing_xa(thd) ?
+ bool is_xa_prepare= is_preparing_xa(thd);
+
+ error= is_xa_prepare ?
binlog_commit_flush_xa_prepare(thd, all, cache_mngr) :
binlog_commit_flush_trx_cache (thd, all, cache_mngr);
+ // the user xa is unlogged on common exec path with the "empty" xa case
+ if (cache_mngr->need_unlog && !is_xa_prepare)
+ {
+ error=
+ mysql_bin_log.unlog(BINLOG_COOKIE_MAKE(cache_mngr->binlog_id,
+ cache_mngr->delayed_error), 1);
+ cache_mngr->need_unlog= false;
+ }
}
/*
This is part of the stmt rollback.
@@ -7621,16 +7631,16 @@ MYSQL_BIN_LOG::write_transaction_to_binlog(THD *thd,
entry.using_trx_cache= using_trx_cache;
entry.need_unlog= is_preparing_xa(thd);
ha_info= all ? thd->transaction->all.ha_list : thd->transaction->stmt.ha_list;
+ entry.end_event= end_ev;
+ auto has_xid= entry.end_event->get_type_code() == XID_EVENT;
- for (; !entry.need_unlog && ha_info; ha_info= ha_info->next())
+ for (; has_xid && !entry.need_unlog && ha_info; ha_info= ha_info->next())
{
if (ha_info->is_started() && ha_info->ht() != binlog_hton &&
!ha_info->ht()->commit_checkpoint_request)
entry.need_unlog= true;
- break;
}
- entry.end_event= end_ev;
if (cache_mngr->stmt_cache.has_incident() ||
cache_mngr->trx_cache.has_incident())
{