mirror of
https://github.com/MariaDB/server.git
synced 2025-12-06 20:35:45 +01:00
Two transactions could binlog their completions in opposite to how it is done in Engine. That is is rare situations ROLLBACK in Engine of the dependency parent transaction could be scheduled by the transaction before its binlogging. That give a follower dependency child one get binlogged ahead of the parent. For fixing this bug its necessary to ensure the binlogging phase is always first one in the internal one-phase rollback protocol. The commit makes sure the binlog handlerton always rollbacks as first handlerton in no-2pc cases. An added test demonstrates how the child could otherwise reach binlog before its parent.
41 lines
1.6 KiB
Text
41 lines
1.6 KiB
Text
create table t1 (a int primary key, b text) engine=innodb;
|
|
connect trx1_rollback,localhost,root,,;
|
|
CREATE TABLE t_x (a int) engine=MEMORY;
|
|
SET binlog_format=row;
|
|
CREATE TEMPORARY TABLE tt_tmp ( id INT ) ENGINE = Memory;
|
|
BEGIN;
|
|
insert into t_x values (1);
|
|
drop temporary table tt_tmp;
|
|
insert into t1 values (99, "gotta log first");
|
|
SET DEBUG_SYNC= 'reset';
|
|
SET DEBUG_SYNC= "before_group_commit_queue SIGNAL trx1_at_log WAIT_FOR trx1_go";
|
|
ROLLBACK;
|
|
connect trx2_commit,localhost,root,,;
|
|
insert into t1 values (99, "second best in binlog");
|
|
connection default;
|
|
SET DEBUG_SYNC= "now WAIT_FOR trx1_at_log";
|
|
SET DEBUG_SYNC= "now SIGNAL trx1_go";
|
|
connection trx2_commit;
|
|
select * from t1;
|
|
a b
|
|
99 second best in binlog
|
|
# Prove the logging order is Trx1, Trx2
|
|
include/show_binlog_events.inc
|
|
Log_name Pos Event_type Server_id End_log_pos Info
|
|
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000001 # Annotate_rows # # insert into t_x values (1)
|
|
master-bin.000001 # Table_map # # table_id: # (test.t_x)
|
|
master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F
|
|
master-bin.000001 # Query # # COMMIT
|
|
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000001 # Annotate_rows # # insert into t1 values (99, "gotta log first")
|
|
master-bin.000001 # Table_map # # table_id: # (test.t1)
|
|
master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F
|
|
master-bin.000001 # Query # # ROLLBACK
|
|
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000001 # Query # # use `test`; insert into t1 values (99, "second best in binlog")
|
|
master-bin.000001 # Xid # # COMMIT /* XID */
|
|
drop table t_x, t1;
|
|
disconnect trx1_rollback;
|
|
disconnect trx2_commit;
|
|
# end of the tests
|