mirror of
https://github.com/MariaDB/server.git
synced 2025-01-24 15:54:37 +01:00
c8c4500a98
The bug allow multiple executing transactions working with non-transactional to interfere with each others by interleaving the events of different trans- actions. Bug is fixed by writing non-transactional events to the transaction cache and flushing the cache to the binary log at statement commit. To mimic the behavior of normal statement-based replication, we flush the transaction cache in row- based mode when there is no committed statements in the transaction cache, which means we are committing the first one. This means that it will be written to the binary log as a "mini-transaction" with just the rows for the statement. Note that the changes here does not take effect when building the server with HAVE_TRANSACTIONS set to false, but it is not clear if this was possible before this patch either. For row-based logging, we also have that when AUTOCOMMIT=1, the code now always generates a BEGIN/COMMIT pair for single statements, or BEGIN/ROLLBACK pair in the case of non-transactional changes in a statement that was rolled back. Note that for the case where changes to a non-transactional table causes a rollback due to error, the statement will now be logged with a BEGIN/ROLLBACK pair, even though some changes has been committed to the non-transactional table.
92 lines
5 KiB
Text
92 lines
5 KiB
Text
CREATE TABLE t1m (m INT, n INT) ENGINE=MYISAM;
|
|
CREATE TABLE t1b (b INT, c INT) ENGINE=BLACKHOLE;
|
|
CREATE TABLE t1n (e INT, f INT) ENGINE=NDB;
|
|
RESET MASTER;
|
|
SET SESSION BINLOG_FORMAT=STATEMENT;
|
|
INSERT INTO t1b VALUES (1,1), (1,2), (2,1), (2,2);
|
|
INSERT INTO t1m VALUES (1,1), (1,2), (2,1), (2,2);
|
|
UPDATE t1m, t1b SET m = 2, b = 3 WHERE n = c;
|
|
*** Please look in binlog_multi_engine.test if you have a diff here ****
|
|
START TRANSACTION;
|
|
INSERT INTO t1n VALUES (1,1), (1,2), (2,1), (2,2);
|
|
UPDATE t1m, t1n SET m = 2, e = 3 WHERE n = f;
|
|
UPDATE t1n, t1b SET e = 2, b = 3 WHERE f = c;
|
|
COMMIT;
|
|
TRUNCATE t1m;
|
|
TRUNCATE t1b;
|
|
TRUNCATE t1n;
|
|
show binlog events from <binlog_start>;
|
|
Log_name Pos Event_type Server_id End_log_pos Info
|
|
master-bin.000001 # Query # # use `test`; BEGIN
|
|
master-bin.000001 # Query # # use `test`; INSERT INTO t1b VALUES (1,1), (1,2), (2,1), (2,2)
|
|
master-bin.000001 # Query # # use `test`; COMMIT
|
|
master-bin.000001 # Query # # use `test`; INSERT INTO t1m VALUES (1,1), (1,2), (2,1), (2,2)
|
|
master-bin.000001 # Query # # use `test`; UPDATE t1m, t1b SET m = 2, b = 3 WHERE n = c
|
|
master-bin.000001 # Query # # use `test`; BEGIN
|
|
master-bin.000001 # Query # # use `test`; INSERT INTO t1n VALUES (1,1), (1,2), (2,1), (2,2)
|
|
master-bin.000001 # Query # # use `test`; UPDATE t1m, t1n SET m = 2, e = 3 WHERE n = f
|
|
master-bin.000001 # Query # # use `test`; UPDATE t1n, t1b SET e = 2, b = 3 WHERE f = c
|
|
master-bin.000001 # Query # # use `test`; COMMIT
|
|
master-bin.000001 # Query # # BEGIN
|
|
master-bin.000001 # Table_map # # table_id: # (test.t1n)
|
|
master-bin.000001 # Table_map # # table_id: # (mysql.ndb_apply_status)
|
|
master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
|
|
master-bin.000001 # Query # # COMMIT
|
|
master-bin.000001 # Query # # use `test`; TRUNCATE t1m
|
|
master-bin.000001 # Query # # use `test`; TRUNCATE t1b
|
|
master-bin.000001 # Query # # use `test`; TRUNCATE t1n
|
|
RESET MASTER;
|
|
SET SESSION BINLOG_FORMAT=MIXED;
|
|
INSERT INTO t1b VALUES (1,1), (1,2), (2,1), (2,2);
|
|
INSERT INTO t1m VALUES (1,1), (1,2), (2,1), (2,2);
|
|
INSERT INTO t1n VALUES (1,1), (1,2), (2,1), (2,2);
|
|
UPDATE t1m, t1b SET m = 2, b = 3 WHERE n = c;
|
|
UPDATE t1m, t1n SET m = 2, e = 3 WHERE n = f;
|
|
ERROR HY000: Binary logging not possible. Message: Statement cannot be written atomically since more than one engine involved and at least one engine is self-logging
|
|
UPDATE t1n, t1b SET e = 2, b = 3 WHERE f = c;
|
|
ERROR HY000: Binary logging not possible. Message: Statement cannot be written atomically since more than one engine involved and at least one engine is self-logging
|
|
TRUNCATE t1m;
|
|
TRUNCATE t1b;
|
|
TRUNCATE t1n;
|
|
show binlog events from <binlog_start>;
|
|
Log_name Pos Event_type Server_id End_log_pos Info
|
|
master-bin.000001 # Query # # use `test`; BEGIN
|
|
master-bin.000001 # Query # # use `test`; INSERT INTO t1b VALUES (1,1), (1,2), (2,1), (2,2)
|
|
master-bin.000001 # Query # # use `test`; COMMIT
|
|
master-bin.000001 # Query # # use `test`; INSERT INTO t1m VALUES (1,1), (1,2), (2,1), (2,2)
|
|
master-bin.000001 # Query # # BEGIN
|
|
master-bin.000001 # Table_map # # table_id: # (test.t1n)
|
|
master-bin.000001 # Table_map # # table_id: # (mysql.ndb_apply_status)
|
|
master-bin.000001 # Write_rows # # table_id: #
|
|
master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
|
|
master-bin.000001 # Query # # COMMIT
|
|
master-bin.000001 # Query # # use `test`; UPDATE t1m, t1b SET m = 2, b = 3 WHERE n = c
|
|
master-bin.000001 # Query # # use `test`; TRUNCATE t1m
|
|
master-bin.000001 # Query # # use `test`; TRUNCATE t1b
|
|
master-bin.000001 # Query # # use `test`; TRUNCATE t1n
|
|
RESET MASTER;
|
|
SET SESSION BINLOG_FORMAT=ROW;
|
|
INSERT INTO t1m VALUES (1,1), (1,2), (2,1), (2,2);
|
|
INSERT INTO t1b VALUES (1,1), (1,2), (2,1), (2,2);
|
|
ERROR HY000: Binary logging not possible. Message: Row-based format required for this statement, but not allowed by this combination of engines
|
|
INSERT INTO t1n VALUES (1,1), (1,2), (2,1), (2,2);
|
|
UPDATE t1m, t1b SET m = 2, b = 3 WHERE n = c;
|
|
ERROR HY000: Binary logging not possible. Message: Row-based format required for this statement, but not allowed by this combination of engines
|
|
UPDATE t1m, t1n SET m = 2, e = 3 WHERE n = f;
|
|
ERROR HY000: Binary logging not possible. Message: Statement cannot be written atomically since more than one engine involved and at least one engine is self-logging
|
|
UPDATE t1n, t1b SET e = 2, b = 3 WHERE f = c;
|
|
ERROR HY000: Binary logging not possible. Message: Row-based format required for this statement, but not allowed by this combination of engines
|
|
show binlog events from <binlog_start>;
|
|
Log_name Pos Event_type Server_id End_log_pos Info
|
|
master-bin.000001 # Query # # use `test`; BEGIN
|
|
master-bin.000001 # Table_map # # table_id: # (test.t1m)
|
|
master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
|
|
master-bin.000001 # Query # # use `test`; COMMIT
|
|
master-bin.000001 # Query # # BEGIN
|
|
master-bin.000001 # Table_map # # table_id: # (test.t1n)
|
|
master-bin.000001 # Table_map # # table_id: # (mysql.ndb_apply_status)
|
|
master-bin.000001 # Write_rows # # table_id: #
|
|
master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
|
|
master-bin.000001 # Query # # COMMIT
|
|
RESET MASTER;
|
|
DROP TABLE t1m, t1b, t1n;
|