mariadb/mysql-test/suite/rpl/r/rpl_begin_commit_rollback.result
Alfranio Correia 60d4662496 WL#2687 WL#5072 BUG#40278 BUG#47175
Non-transactional updates that take place inside a transaction present problems
for logging because they are visible to other clients before the transaction
is committed, and they are not rolled back even if the transaction is rolled
back. It is not always possible to log correctly in statement format when both
transactional and non-transactional tables are used in the same transaction.

In the current patch, we ensure that such scenario is completely safe under the
ROW and MIXED modes.
2009-11-03 19:02:56 +00:00

113 lines
2.3 KiB
Text

stop slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
reset master;
reset slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
start slave;
call mtr.add_suppression("Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT");
call mtr.add_suppression("Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT");
DROP DATABASE IF EXISTS db1;
CREATE DATABASE db1;
use db1;
CREATE TABLE db1.t1 (a INT) ENGINE=InnoDB;
CREATE TABLE db1.t2 (s CHAR(255)) ENGINE=MyISAM;
include/stop_slave.inc
[on master]
CREATE PROCEDURE db1.p1 ()
BEGIN
INSERT INTO t1 VALUES (1);
INSERT INTO t1 VALUES (2);
INSERT INTO t1 VALUES (3);
INSERT INTO t1 VALUES (4);
INSERT INTO t1 VALUES (5);
END//
CREATE PROCEDURE db1.p2 ()
BEGIN
INSERT INTO t1 VALUES (6);
INSERT INTO t1 VALUES (7);
INSERT INTO t1 VALUES (8);
INSERT INTO t1 VALUES (9);
INSERT INTO t1 VALUES (10);
INSERT INTO t2 VALUES ('executed db1.p2()');
END//
INSERT INTO db1.t2 VALUES ('before call db1.p1()');
use test;
BEGIN;
CALL db1.p1();
COMMIT;
INSERT INTO db1.t2 VALUES ('after call db1.p1()');
SELECT * FROM db1.t1;
a
1
2
3
4
5
SELECT * FROM db1.t2;
s
before call db1.p1()
after call db1.p1()
[on slave]
start slave until master_log_file='master-bin.000001', master_log_pos=MASTER_POS;
#
# If we got non-zero here, then we're suffering BUG#43263
#
SELECT 0 as 'Must be 0';
Must be 0
0
SELECT * from db1.t1;
a
1
2
3
4
5
SELECT * from db1.t2;
s
before call db1.p1()
[on master]
INSERT INTO db1.t2 VALUES ('before call db1.p2()');
BEGIN;
CALL db1.p2();
Warnings:
Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Reason for unsafeness: Non-transactional reads or writes are unsafe if they occur after transactional reads or writes inside a transaction.
ROLLBACK;
INSERT INTO db1.t2 VALUES ('after call db1.p2()');
SELECT * FROM db1.t1;
a
1
2
3
4
5
SELECT * FROM db1.t2;
s
before call db1.p1()
after call db1.p1()
before call db1.p2()
executed db1.p2()
after call db1.p2()
[on slave]
start slave until master_log_file='master-bin.000001', master_log_pos=MASTER_POS;
#
# If we got non-zero here, then we're suffering BUG#43263
#
SELECT 0 as 'Must be 0';
Must be 0
0
SELECT * from db1.t1;
a
1
2
3
4
5
SELECT * from db1.t2;
s
before call db1.p1()
executed db1.p2()
#
# Clean up
#
DROP DATABASE db1;
DROP DATABASE db1;