1
0
mirror of https://github.com/MariaDB/server.git synced 2025-09-02 09:41:40 +03:00

Bug #40116: Uncommited changes are replicated and stay on slave

after rollback on master

When starting a transaction with a statement containing changes
to both transactional tables and non-transactional tables, the
statement is considered as non-transactional and is therefore
written directly to the binary log. This behaviour was present
in 5.0, and has propagated to 5.1.

If a trigger containing a change of a non-transactional table is
added to a transactional table, any changes to the transactional
table is "tainted" as non-transactional.

This patch solves the problem by removing the existing "hack" that
allows non-transactional statements appearing first in a transaction
to be written directly to the binary log. Instead, anything inside
a transaction is treaded as part of the transaction and not written
to the binary log until the transaction is committed.
This commit is contained in:
Mats Kindahl
2008-12-03 20:55:49 +01:00
parent 5a897c8b4e
commit 82757fdfc0
8 changed files with 152 additions and 126 deletions

View File

@@ -467,20 +467,46 @@ drop trigger if exists t1_bi;
insert into t1 values (3, "c");
select * from t1;
save_master_pos;
connection slave;
sync_with_master;
sync_slave_with_master;
select * from t1;
connection master;
drop table t1;
sync_slave_with_master;
#
# Bug#40116: Uncommited changes are replicated and stay on slave after
# rollback on master
#
source include/master-slave-reset.inc;
source include/have_innodb.inc;
connection master;
create table t1 ( f int ) engine = innodb;
create table log ( r int ) engine = myisam;
create trigger tr
after insert on t1
for each row insert into log values ( new.f );
set autocommit = 0;
insert into t1 values ( 1 );
select * from t1;
sync_slave_with_master;
select * from t1;
connection master;
rollback;
select * from t1;
sync_slave_with_master;
select * from t1;
connection master;
drop table t1, log;
sync_slave_with_master;
#
# End of tests
#
save_master_pos;
connection slave;
sync_with_master;