mirror of
https://github.com/MariaDB/server.git
synced 2026-05-15 03:17:20 +02:00
The problem was that the server did not robustly handle a unilateral roll back issued by the Resource Manager (RM) due to a resource deadlock within the transaction branch. By not acknowledging the roll back, the server (TM) would eventually corrupt the XA transaction state and crash. The solution is to mark the transaction as rollback-only if the RM indicates that it rolled back its branch of the transaction. mysql-test/r/xa.result: Add test case result for Bug#28323 mysql-test/t/xa.test: Add test case for Bug#28323 sql/handler.cc: Reset XID only at the end of the global transaction. sql/share/errmsg.txt: Add new error codes. sql/sql_class.h: Remember the error reported by the Resource Manager. sql/sql_parse.cc: Rollback the transaction if the Resource Manager reported a error and rolled back its branch of the transaction.
120 lines
2.2 KiB
Text
120 lines
2.2 KiB
Text
#
|
|
# WL#1756
|
|
#
|
|
-- source include/have_innodb.inc
|
|
--disable_warnings
|
|
drop table if exists t1, t2;
|
|
--enable_warnings
|
|
create table t1 (a int) engine=innodb;
|
|
xa start 'test1';
|
|
insert t1 values (10);
|
|
xa end 'test1';
|
|
xa prepare 'test1';
|
|
xa rollback 'test1';
|
|
select * from t1;
|
|
|
|
xa start 'test2';
|
|
--error 1399
|
|
xa start 'test-bad';
|
|
insert t1 values (20);
|
|
--error 1399
|
|
xa prepare 'test2';
|
|
xa end 'test2';
|
|
xa prepare 'test2';
|
|
xa commit 'test2';
|
|
select * from t1;
|
|
|
|
xa start 'testa','testb';
|
|
insert t1 values (30);
|
|
|
|
--error 1399
|
|
commit;
|
|
|
|
xa end 'testa','testb';
|
|
|
|
--error 1399
|
|
begin;
|
|
--error 1399
|
|
create table t2 (a int);
|
|
|
|
connect (con1,localhost,root,,);
|
|
connection con1;
|
|
|
|
--error 1440
|
|
xa start 'testa','testb';
|
|
--error 1440
|
|
xa start 'testa','testb', 123;
|
|
|
|
# gtrid [ , bqual [ , formatID ] ]
|
|
xa start 0x7465737462, 0x2030405060, 0xb;
|
|
insert t1 values (40);
|
|
xa end 'testb',' 0@P`',11;
|
|
xa prepare 'testb',0x2030405060,11;
|
|
|
|
--error 1399
|
|
start transaction;
|
|
|
|
xa recover;
|
|
|
|
# uncomment the line below when binlog will be able to prepare
|
|
#disconnect con1;
|
|
connection default;
|
|
|
|
xa prepare 'testa','testb';
|
|
|
|
xa recover;
|
|
|
|
--error 1397
|
|
xa commit 'testb',0x2030405060,11;
|
|
xa rollback 'testa','testb';
|
|
|
|
--error 1064
|
|
xa start 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz';
|
|
|
|
select * from t1;
|
|
drop table t1;
|
|
|
|
disconnect con1;
|
|
|
|
#
|
|
# Bug#28323: Server crashed in xid cache operations
|
|
#
|
|
|
|
--disable_warnings
|
|
drop table if exists t1;
|
|
--enable_warnings
|
|
|
|
create table t1(a int, b int, c varchar(20), primary key(a)) engine = innodb;
|
|
insert into t1 values(1, 1, 'a');
|
|
insert into t1 values(2, 2, 'b');
|
|
|
|
connect (con1,localhost,root,,);
|
|
connect (con2,localhost,root,,);
|
|
|
|
--connection con1
|
|
xa start 'a','b';
|
|
update t1 set c = 'aa' where a = 1;
|
|
--connection con2
|
|
xa start 'a','c';
|
|
update t1 set c = 'bb' where a = 2;
|
|
--connection con1
|
|
--send update t1 set c = 'bb' where a = 2
|
|
--connection con2
|
|
--sleep 1
|
|
--error ER_LOCK_DEADLOCK
|
|
update t1 set c = 'aa' where a = 1;
|
|
select count(*) from t1;
|
|
--error ER_XA_RBDEADLOCK
|
|
xa end 'a','c';
|
|
xa rollback 'a','c';
|
|
--disconnect con2
|
|
|
|
connect (con3,localhost,root,,);
|
|
--connection con3
|
|
xa start 'a','c';
|
|
|
|
--disconnect con1
|
|
--disconnect con3
|
|
--connection default
|
|
|
|
--echo End of 5.0 tests
|