From acf9b1f346e8b9dc59ad8e1f6a1ff20ef96d0dcd Mon Sep 17 00:00:00 2001 From: "kostja@dipika.(none)" <> Date: Tue, 19 Feb 2008 14:43:01 +0300 Subject: A fix and a test case for Bug#12713 "Error in a stored function called from a SELECT doesn't cause ROLLBACK of statem". The idea of the fix is to ensure that we always commit the current statement at the end of dispatch_command(). In order to not issue redundant disc syncs, an optimization of the two-phase commit protocol is implemented to bypass the two phase commit if the transaction is read-only. --- sql/rpl_injector.cc | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'sql/rpl_injector.cc') diff --git a/sql/rpl_injector.cc b/sql/rpl_injector.cc index aa3020c42be..684655d1c3b 100644 --- a/sql/rpl_injector.cc +++ b/sql/rpl_injector.cc @@ -62,6 +62,26 @@ int injector::transaction::commit() { DBUG_ENTER("injector::transaction::commit()"); m_thd->binlog_flush_pending_rows_event(true); + /* + Cluster replication does not preserve statement or + transaction boundaries of the master. Instead, a new + transaction on replication slave is started when a new GCI + (global checkpoint identifier) is issued, and is committed + when the last event of the check point has been received and + processed. This ensures consistency of each cluster in + cluster replication, and there is no requirement for stronger + consistency: MySQL replication is asynchronous with other + engines as well. + + A practical consequence of that is that row level replication + stream passed through the injector thread never contains + COMMIT events. + Here we should preserve the server invariant that there is no + outstanding statement transaction when the normal transaction + is committed by committing the statement transaction + explicitly. + */ + ha_autocommit_or_rollback(m_thd, 0); end_trans(m_thd, COMMIT); DBUG_RETURN(0); } -- cgit v1.2.1