@@ -1410,7 +1410,9 @@ void mysql_rpl_listener_2::process_event ( void *ev_x, _repl_log_x_error *error
14101410 }
14111411 memset ( query_str, 0 , qle->q_len + 8 );
14121412 memcpy ( query_str, qle->query , qle->q_len );
1413- if ( strcmp ( " BEGIN" , query_str ) == 0 ) {
1413+ if (
1414+ ( strcmp ( " BEGIN" , query_str ) == 0 ) ||
1415+ ( strcmp ( " XA START" , query_str ) == 0 ) ) {
14141416
14151417 __sync_bool_compare_and_swap ( &(this ->state ),
14161418 (uint32_t )(mysql_rpl_listener_2::__State::INPROCESS_1),
@@ -1424,7 +1426,9 @@ void mysql_rpl_listener_2::process_event ( void *ev_x, _repl_log_x_error *error
14241426 // а если мы встретим в дальнейшем таблицы, которые мы отслеживаем внутри этой транзакции,
14251427 // то мы вызовем this->on_transaction со временем первого ROW_EVENTа
14261428 }
1427- if ( strcmp ( " COMMIT" , query_str ) == 0 ) {
1429+ if (
1430+ /* ( strcmp( "COMMIT", query_str ) == 0 ) || */
1431+ ( strcmp ( " COMMIT" , query_str ) == 0 ) ) {
14281432
14291433 // TRANSACTION!!!!
14301434 // > 1 потому, что мы, изначально встретив query BEGIN ставим в 1,
@@ -1740,7 +1744,7 @@ void mysql_rpl_listener_2::process_event ( void *ev_x, _repl_log_x_error *error
17401744 }
17411745 case binary_log::XID_EVENT: {
17421746
1743- // по сути может представлять как Xid_event так и XA_prepare_event ,
1747+ // по сути может представлять как Xid_event так и XA_prepare_event , ( хз - может это и не так!!! )
17441748 // но для нас не важно какого именно типа транзакция подтверждается.
17451749 ;;
17461750 Xid_log_event *xidle = (Xid_log_event *)ev;
@@ -1772,6 +1776,39 @@ void mysql_rpl_listener_2::process_event ( void *ev_x, _repl_log_x_error *error
17721776
17731777 break ;
17741778 }
1779+ case binary_log::XA_PREPARE_LOG_EVENT: {
1780+
1781+ // XA_prepare_log_event
1782+ ;;
1783+ XA_prepare_log_event *xaple = (XA_prepare_log_event *)ev;
1784+ // -- xaple->xid;
1785+
1786+ // TRANSACTION!!!!
1787+ // > 1 потому, что мы, изначально встретив query BEGIN ставим в 1,
1788+ // а потом, если внутри транзакции встречаем одну из отслеживаемых таблиц,.
1789+ // то ставим в 2
1790+ if ( this ->in_transaction > 1 ) {
1791+
1792+ if ( __sync_fetch_and_add ( &( this ->state ), (uint32_t )0 ) == mysql_rpl_listener_2::__State::INPROCESS ) {
1793+
1794+ if ( this ->on_transaction != NULL ) {
1795+
1796+ _repl_log_x_transaction X_TR_EV;
1797+ X_TR_EV.when = xaple->common_header ->when ;
1798+ X_TR_EV.transaction_event_type = (uint8_t )( TRANSACTION_EV_TYPE_COMMIT );
1799+
1800+ this ->on_transaction ( &X_TR_EV, this ->on_transaction_param_ptr );
1801+ }
1802+ }
1803+ }
1804+ this ->in_transaction = 0 ;
1805+
1806+ __sync_bool_compare_and_swap ( &(this ->state ),
1807+ (uint32_t )(mysql_rpl_listener_2::__State::INPROCESS_1),
1808+ (uint32_t )(mysql_rpl_listener_2::__State::INPROCESS ) );
1809+
1810+ break ;
1811+ }
17751812 case binary_log::PREVIOUS_GTIDS_LOG_EVENT: {
17761813 ;;
17771814 break ;
0 commit comments