CREATE TABLE t1 (f1 INT PRIMARY KEY) ENGINE=InnoDB; # Case 1: Server goes through graceful shutdown and is restarted connection default; INSERT INTO t1 VALUES (1); Performing --wsrep-recover ... Using --wsrep-start-position when starting mysqld ... Expect 100-10-2 SELECT WSREP_LAST_SEEN_GTID(); WSREP_LAST_SEEN_GTID() 100-10-2 SELECT @@GLOBAL.gtid_binlog_pos; @@GLOBAL.gtid_binlog_pos 100-10-2 SELECT * FROM t1; f1 1 # Case 2: Server is killed after the transaction gets prepared # but before it is written into binlog. As there is not GTID assigned, # the transaction must be rolled back during recovery. connect con, localhost, root; SET DEBUG_SYNC = "ha_commit_trans_after_prepare SIGNAL reached WAIT_FOR continue"; INSERT INTO t1 VALUES (2); connection default; SET DEBUG_SYNC = "now WAIT_FOR reached"; # Kill the server Performing --wsrep-recover ... Using --wsrep-start-position when starting mysqld ... Expect 100-10-2 SELECT WSREP_LAST_SEEN_GTID(); WSREP_LAST_SEEN_GTID() 100-10-2 SELECT @@GLOBAL.gtid_binlog_pos; @@GLOBAL.gtid_binlog_pos 100-10-2 Expect 1 SELECT * FROM t1; f1 1 disconnect con; # Case 3: Server is killed after the transaction gets written into binlog # but before it is committed in storage engine. In this case the # transaction must be committed during recovery as it had a valid # GTID assigned. connect con, localhost, root; SET DEBUG_SYNC = "commit_before_get_LOCK_commit_ordered SIGNAL reached WAIT_FOR continue"; INSERT INTO t1 VALUES (3); connection default; SET DEBUG_SYNC = "now WAIT_FOR reached"; # Kill the server Performing --wsrep-recover ... Using --wsrep-start-position when starting mysqld ... Expect 100-10-3 SELECT WSREP_LAST_SEEN_GTID(); WSREP_LAST_SEEN_GTID() 100-10-3 SELECT @@GLOBAL.gtid_binlog_pos; @@GLOBAL.gtid_binlog_pos 100-10-3 Expect 1 3 SELECT * FROM t1; f1 1 3 disconnect con; DROP TABLE t1;