@@ -1410,7 +1410,9 @@ void mysql_rpl_listener_2::process_event ( void *ev_x, _repl_log_x_error *error
1410
1410
}
1411
1411
memset ( query_str, 0 , qle->q_len + 8 );
1412
1412
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 ) ) {
1414
1416
1415
1417
__sync_bool_compare_and_swap ( &(this ->state ),
1416
1418
(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
1424
1426
// а если мы встретим в дальнейшем таблицы, которые мы отслеживаем внутри этой транзакции,
1425
1427
// то мы вызовем this->on_transaction со временем первого ROW_EVENTа
1426
1428
}
1427
- if ( strcmp ( " COMMIT" , query_str ) == 0 ) {
1429
+ if (
1430
+ /* ( strcmp( "COMMIT", query_str ) == 0 ) || */
1431
+ ( strcmp ( " COMMIT" , query_str ) == 0 ) ) {
1428
1432
1429
1433
// TRANSACTION!!!!
1430
1434
// > 1 потому, что мы, изначально встретив query BEGIN ставим в 1,
@@ -1740,7 +1744,7 @@ void mysql_rpl_listener_2::process_event ( void *ev_x, _repl_log_x_error *error
1740
1744
}
1741
1745
case binary_log::XID_EVENT: {
1742
1746
1743
- // по сути может представлять как Xid_event так и XA_prepare_event ,
1747
+ // по сути может представлять как Xid_event так и XA_prepare_event , ( хз - может это и не так!!! )
1744
1748
// но для нас не важно какого именно типа транзакция подтверждается.
1745
1749
;;
1746
1750
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
1772
1776
1773
1777
break ;
1774
1778
}
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
+ }
1775
1812
case binary_log::PREVIOUS_GTIDS_LOG_EVENT: {
1776
1813
;;
1777
1814
break ;
0 commit comments