mirror of
https://github.com/MariaDB/server.git
synced 2025-01-23 07:14:17 +01:00
6f95733406
Conflicts: - mysql-test/r/mysqld--help-win.result - sql/sys_vars.cc Original revsion (in next-mr-bugfixing): ------------------------------------------------------------ revno: 2971 [merge] revision-id: alfranio.correia@sun.com-20100121210527-rbuheu5rnsmcakh1 committer: Alfranio Correia <alfranio.correia@sun.com> branch nick: mysql-next-mr-bugfixing timestamp: Thu 2010-01-21 21:05:27 +0000 message: BUG#46364 MyISAM transbuffer problems (NTM problem) It is well-known that due to concurrency issues, a slave can become inconsistent when a transaction contains updates to both transaction and non-transactional tables. In a nutshell, the current code-base tries to preserve causality among the statements by writing non-transactional statements to the txn-cache which is flushed upon commit. However, modifications done to non-transactional tables on behalf of a transaction become immediately visible to other connections but may not immediately get into the binary log and therefore consistency may be broken. In general, it is impossible to automatically detect causality/dependency among statements by just analyzing the statements sent to the server. This happen because dependency may be hidden in the application code and it is necessary to know a priori all the statements processed in the context of a transaction such as in a procedure. Moreover, even for the few cases that we could automatically address in the server, the computation effort required could make the approach infeasible. So, in this patch we introduce the option - "--binlog-direct-non-transactional-updates" that can be used to bypass the current behavior in order to write directly to binary log statements that change non-transactional tables. Besides, it is used to enable the WL#2687 which is disabled by default. ------------------------------------------------------------ revno: 2970.1.1 revision-id: alfranio.correia@sun.com-20100121131034-183r4qdyld7an5a0 parent: alik@sun.com-20100121083914-r9rz2myto3tkdya0 committer: Alfranio Correia <alfranio.correia@sun.com> branch nick: mysql-next-mr-bugfixing timestamp: Thu 2010-01-21 13:10:34 +0000 message: BUG#46364 MyISAM transbuffer problems (NTM problem) It is well-known that due to concurrency issues, a slave can become inconsistent when a transaction contains updates to both transaction and non-transactional tables. In a nutshell, the current code-base tries to preserve causality among the statements by writing non-transactional statements to the txn-cache which is flushed upon commit. However, modifications done to non-transactional tables on behalf of a transaction become immediately visible to other connections but may not immediately get into the binary log and therefore consistency may be broken. In general, it is impossible to automatically detect causality/dependency among statements by just analyzing the statements sent to the server. This happen because dependency may be hidden in the application code and it is necessary to know a priori all the statements processed in the context of a transaction such as in a procedure. Moreover, even for the few cases that we could automatically address in the server, the computation effort required could make the approach infeasible. So, in this patch we introduce the option - "--binlog-direct-non-transactional-updates" that can be used to bypass the current behavior in order to write directly to binary log statements that change non-transactional tables. Besides, it is used to enable the WL#2687 which is disabled by default.
138 lines
5 KiB
Text
138 lines
5 KiB
Text
#
|
|
# BUG#47863
|
|
# This test verifies if the session variable 'binlog_format'
|
|
# is read-only inside a transaction and in sub-statements.
|
|
#
|
|
|
|
source include/have_innodb.inc;
|
|
source include/have_binlog_format_row.inc;
|
|
|
|
set @save_binlog_format= @@global.binlog_format;
|
|
set @save_binlog_dirct= @@global.binlog_direct_non_transactional_updates;
|
|
create table t1 (a int) engine= myisam;
|
|
create table t2 (a int) engine= innodb;
|
|
|
|
SELECT @@session.binlog_format;
|
|
SET AUTOCOMMIT=1;
|
|
--echo # Test that the session variable 'binlog_format'
|
|
--echo # is writable outside a transaction.
|
|
set @@session.binlog_format= statement;
|
|
set @@session.binlog_direct_non_transactional_updates= TRUE;
|
|
SELECT @@session.binlog_format;
|
|
SELECT @@session.binlog_direct_non_transactional_updates;
|
|
|
|
begin;
|
|
--echo # Test that the session variable 'binlog_format' is read-only
|
|
--echo # inside a transaction with no preceding updates.
|
|
--error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT
|
|
set @@session.binlog_format= mixed;
|
|
--error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_DIRECT
|
|
set @@session.binlog_direct_non_transactional_updates= FALSE;
|
|
|
|
insert into t2 values (1);
|
|
--echo # Test that the session variable 'binlog_format' is read-only
|
|
--echo # inside a transaction with preceding transactional updates.
|
|
--error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT
|
|
set @@session.binlog_format= row;
|
|
--error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_DIRECT
|
|
set @@session.binlog_direct_non_transactional_updates= FALSE;
|
|
commit;
|
|
|
|
begin;
|
|
insert into t1 values (2);
|
|
--echo # Test that the session variable 'binlog_format' is read-only
|
|
--echo # inside a transaction with preceding non-transactional updates.
|
|
--error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT
|
|
set @@session.binlog_format= statement;
|
|
--error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_DIRECT
|
|
set @@session.binlog_direct_non_transactional_updates= FALSE;
|
|
commit;
|
|
|
|
--echo # Test that the session variable 'binlog_format' is writable
|
|
--echo # when AUTOCOMMIT=0, before a transaction has started.
|
|
set AUTOCOMMIT=0;
|
|
set @@session.binlog_format= row;
|
|
set @@session.binlog_direct_non_transactional_updates= FALSE;
|
|
SELECT @@session.binlog_format;
|
|
SELECT @@session.binlog_direct_non_transactional_updates;
|
|
|
|
insert into t1 values (4);
|
|
--echo # Test that the session variable 'binlog_format' is read-only inside an
|
|
--echo # AUTOCOMMIT=0 transaction with preceding non-transactional updates.
|
|
--error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT
|
|
set @@session.binlog_format= statement;
|
|
--error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_DIRECT
|
|
set @@session.binlog_direct_non_transactional_updates= TRUE;
|
|
SELECT @@session.binlog_format;
|
|
SELECT @@session.binlog_direct_non_transactional_updates;
|
|
commit;
|
|
|
|
insert into t2 values (5);
|
|
--echo # Test that the session variable 'binlog_format' is read-only inside an
|
|
--echo # AUTOCOMMIT=0 transaction with preceding transactional updates.
|
|
--error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT
|
|
set @@session.binlog_format= row;
|
|
--error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_DIRECT
|
|
set @@session.binlog_direct_non_transactional_updates= TRUE;
|
|
SELECT @@session.binlog_format;
|
|
SELECT @@session.binlog_direct_non_transactional_updates;
|
|
commit;
|
|
|
|
begin;
|
|
insert into t2 values (6);
|
|
--echo # Test that the global variable 'binlog_format' is writable
|
|
--echo # inside a transaction.
|
|
SELECT @@global.binlog_format;
|
|
set @@global.binlog_format= statement;
|
|
set @@global.binlog_direct_non_transactional_updates= TRUE;
|
|
SELECT @@global.binlog_format;
|
|
SELECT @@global.binlog_direct_non_transactional_updates;
|
|
commit;
|
|
|
|
set @@global.binlog_format= @save_binlog_format;
|
|
set @@global.binlog_direct_non_transactional_updates= @save_binlog_dirct;
|
|
|
|
create table t3(a int, b int) engine= innodb;
|
|
create table t4(a int) engine= innodb;
|
|
create table t5(a int) engine= innodb;
|
|
delimiter |;
|
|
eval create trigger tr1 after insert on t3 for each row begin
|
|
insert into t4(a) values(1);
|
|
set @@session.binlog_format= statement;
|
|
insert into t4(a) values(2);
|
|
insert into t5(a) values(3);
|
|
end |
|
|
delimiter ;|
|
|
|
|
--echo # Test that the session variable 'binlog_format' is read-only
|
|
--echo # in sub-statements.
|
|
--error ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_FORMAT
|
|
insert into t3(a,b) values(1,1);
|
|
SELECT @@session.binlog_format;
|
|
|
|
create table t6(a int, b int) engine= innodb;
|
|
create table t7(a int) engine= innodb;
|
|
create table t8(a int) engine= innodb;
|
|
delimiter |;
|
|
eval create trigger tr2 after insert on t6 for each row begin
|
|
insert into t7(a) values(1);
|
|
set @@global.binlog_direct_non_transactional_updates= FALSE;
|
|
insert into t7(a) values(2);
|
|
insert into t8(a) values(3);
|
|
end |
|
|
delimiter ;|
|
|
|
|
--echo # Test that the session variable 'binlog_format' is read-only
|
|
--echo # in sub-statements.
|
|
--error ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_DIRECT
|
|
insert into t6(a,b) values(1,1);
|
|
SELECT @@session.binlog_direct_non_transactional_updates;
|
|
|
|
drop table t1;
|
|
drop table t2;
|
|
drop table t3;
|
|
drop table t4;
|
|
drop table t5;
|
|
drop table t6;
|
|
drop table t7;
|
|
drop table t8;
|