Skip to content
This repository was archived by the owner on Mar 1, 2026. It is now read-only.

Commit f9e7b50

Browse files
yizhang82Herman Lee
authored andcommitted
Disable XA transactions
Summary: We don't want to support XA operations in our production so this adds capability to disable XA transactions. Reference Patch: f4a6eb9 Reviewed By: luqun Differential Revision: D31133843
1 parent 311b791 commit f9e7b50

13 files changed

Lines changed: 245 additions & 0 deletions

‎mysql-test/r/mysqld--help-notwin.result‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,9 @@ The following options may be given as the first argument:
472472
--enable-user-tables-engine-check
473473
Enable checking storage engine compatibility of user
474474
table creation DDL.
475+
--enable-xa-transaction
476+
Enable XA transactions
477+
(Defaults to on; use --skip-enable-xa-transaction to disable.)
475478
--end-markers-in-json
476479
In JSON output ("EXPLAIN FORMAT=JSON" and optimizer
477480
trace), if variable is set to 1, repeats the structure's
@@ -2989,6 +2992,7 @@ enable-resultset-checksum FALSE
29892992
enable-sql-wsenv FALSE
29902993
enable-super-log-bin-read-only FALSE
29912994
enable-user-tables-engine-check FALSE
2995+
enable-xa-transaction TRUE
29922996
end-markers-in-json FALSE
29932997
enforce-gtid-consistency FALSE
29942998
eq-range-index-dive-limit 200

‎mysql-test/r/xa_detach_on_prepare_off.result‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,18 @@ XA RECOVER;
517517
formatID gtrid_length bqual_length data
518518
1 4 0 xid1
519519
XA ROLLBACK 'xid1';
520+
# Test disabling XA transactions
521+
set @enable_xa_transaction_saved=@@global.enable_xa_transaction;
522+
set global enable_xa_transaction=0;
523+
XA START 'xid1';
524+
ERROR XAE05: XAER_INVAL: Invalid arguments (or unsupported command)
525+
XA END 'xid1';
526+
ERROR XAE05: XAER_INVAL: Invalid arguments (or unsupported command)
527+
XA PREPARE 'xid1';
528+
ERROR XAE05: XAER_INVAL: Invalid arguments (or unsupported command)
529+
XA ROLLBACK 'xid1';
530+
ERROR XAE05: XAER_INVAL: Invalid arguments (or unsupported command)
531+
set global enable_xa_transaction=@enable_xa_transaction_saved;
520532
#
521533
# BUG 31030205 - XA PREPARED TXN WILL STAY AS "RECOVERED TRX" IF ROLLBACK
522534
# XID HAS WRONG FORMATID
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
SET @start_global_value = @@global.enable_xa_transaction;
2+
SELECT @start_global_value;
3+
@start_global_value
4+
1
5+
select @@global.enable_xa_transaction;
6+
@@global.enable_xa_transaction
7+
1
8+
select @@session.enable_xa_transaction;
9+
ERROR HY000: Variable 'enable_xa_transaction' is a GLOBAL variable
10+
show global variables like 'enable_xa_transaction';
11+
Variable_name Value
12+
enable_xa_transaction ON
13+
show session variables like 'enable_xa_transaction';
14+
Variable_name Value
15+
enable_xa_transaction ON
16+
select * from performance_schema.global_variables where variable_name='enable_xa_transaction';
17+
VARIABLE_NAME VARIABLE_VALUE
18+
enable_xa_transaction ON
19+
select * from performance_schema.session_variables where variable_name='enable_xa_transaction';
20+
VARIABLE_NAME VARIABLE_VALUE
21+
enable_xa_transaction ON
22+
set global enable_xa_transaction=0;
23+
select @@global.enable_xa_transaction;
24+
@@global.enable_xa_transaction
25+
0
26+
select * from performance_schema.global_variables where variable_name='enable_xa_transaction';
27+
VARIABLE_NAME VARIABLE_VALUE
28+
enable_xa_transaction OFF
29+
select * from performance_schema.session_variables where variable_name='enable_xa_transaction';
30+
VARIABLE_NAME VARIABLE_VALUE
31+
enable_xa_transaction OFF
32+
set @@global.enable_xa_transaction=TRUE;
33+
select @@global.enable_xa_transaction;
34+
@@global.enable_xa_transaction
35+
1
36+
select * from performance_schema.global_variables where variable_name='enable_xa_transaction';
37+
VARIABLE_NAME VARIABLE_VALUE
38+
enable_xa_transaction ON
39+
select * from performance_schema.session_variables where variable_name='enable_xa_transaction';
40+
VARIABLE_NAME VARIABLE_VALUE
41+
enable_xa_transaction ON
42+
set global enable_xa_transaction=0;
43+
select @@global.enable_xa_transaction;
44+
@@global.enable_xa_transaction
45+
0
46+
select * from performance_schema.global_variables where variable_name='enable_xa_transaction';
47+
VARIABLE_NAME VARIABLE_VALUE
48+
enable_xa_transaction OFF
49+
select * from performance_schema.session_variables where variable_name='enable_xa_transaction';
50+
VARIABLE_NAME VARIABLE_VALUE
51+
enable_xa_transaction OFF
52+
set @@global.enable_xa_transaction=DEFAULT;
53+
select @@global.enable_xa_transaction;
54+
@@global.enable_xa_transaction
55+
1
56+
select * from performance_schema.global_variables where variable_name='enable_xa_transaction';
57+
VARIABLE_NAME VARIABLE_VALUE
58+
enable_xa_transaction ON
59+
select * from performance_schema.session_variables where variable_name='enable_xa_transaction';
60+
VARIABLE_NAME VARIABLE_VALUE
61+
enable_xa_transaction ON
62+
set global enable_xa_transaction='OFF';
63+
select @@global.enable_xa_transaction;
64+
@@global.enable_xa_transaction
65+
0
66+
select * from performance_schema.global_variables where variable_name='enable_xa_transaction';
67+
VARIABLE_NAME VARIABLE_VALUE
68+
enable_xa_transaction OFF
69+
select * from performance_schema.session_variables where variable_name='enable_xa_transaction';
70+
VARIABLE_NAME VARIABLE_VALUE
71+
enable_xa_transaction OFF
72+
set global enable_xa_transaction='ON';
73+
select @@global.enable_xa_transaction;
74+
@@global.enable_xa_transaction
75+
1
76+
select * from performance_schema.global_variables where variable_name='enable_xa_transaction';
77+
VARIABLE_NAME VARIABLE_VALUE
78+
enable_xa_transaction ON
79+
select * from performance_schema.session_variables where variable_name='enable_xa_transaction';
80+
VARIABLE_NAME VARIABLE_VALUE
81+
enable_xa_transaction ON
82+
set session enable_xa_transaction=0;
83+
ERROR HY000: Variable 'enable_xa_transaction' is a GLOBAL variable and should be set with SET GLOBAL
84+
set @@session.enable_xa_transaction=1;
85+
ERROR HY000: Variable 'enable_xa_transaction' is a GLOBAL variable and should be set with SET GLOBAL
86+
set global enable_xa_transaction=1.1;
87+
ERROR 42000: Incorrect argument type to variable 'enable_xa_transaction'
88+
set global enable_xa_transaction=1e1;
89+
ERROR 42000: Incorrect argument type to variable 'enable_xa_transaction'
90+
set global enable_xa_transaction=3;
91+
ERROR 42000: Variable 'enable_xa_transaction' can't be set to the value of '3'
92+
select @@global.enable_xa_transaction;
93+
@@global.enable_xa_transaction
94+
1
95+
set global enable_xa_transaction=-3;
96+
ERROR 42000: Variable 'enable_xa_transaction' can't be set to the value of '-3'
97+
select @@global.enable_xa_transaction;
98+
@@global.enable_xa_transaction
99+
1
100+
set global enable_xa_transaction='AUTO';
101+
ERROR 42000: Variable 'enable_xa_transaction' can't be set to the value of 'AUTO'
102+
SET @@global.enable_xa_transaction = @start_global_value;
103+
SELECT @@global.enable_xa_transaction;
104+
@@global.enable_xa_transaction
105+
1
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
SET @start_global_value = @@global.enable_xa_transaction;
2+
SELECT @start_global_value;
3+
4+
#
5+
# exists as global only
6+
#
7+
select @@global.enable_xa_transaction;
8+
--error ER_INCORRECT_GLOBAL_LOCAL_VAR
9+
select @@session.enable_xa_transaction;
10+
show global variables like 'enable_xa_transaction';
11+
show session variables like 'enable_xa_transaction';
12+
select * from performance_schema.global_variables where variable_name='enable_xa_transaction';
13+
select * from performance_schema.session_variables where variable_name='enable_xa_transaction';
14+
15+
#
16+
# show that it's writable
17+
#
18+
set global enable_xa_transaction=0;
19+
select @@global.enable_xa_transaction;
20+
select * from performance_schema.global_variables where variable_name='enable_xa_transaction';
21+
select * from performance_schema.session_variables where variable_name='enable_xa_transaction';
22+
set @@global.enable_xa_transaction=TRUE;
23+
select @@global.enable_xa_transaction;
24+
select * from performance_schema.global_variables where variable_name='enable_xa_transaction';
25+
select * from performance_schema.session_variables where variable_name='enable_xa_transaction';
26+
set global enable_xa_transaction=0;
27+
select @@global.enable_xa_transaction;
28+
select * from performance_schema.global_variables where variable_name='enable_xa_transaction';
29+
select * from performance_schema.session_variables where variable_name='enable_xa_transaction';
30+
set @@global.enable_xa_transaction=DEFAULT;
31+
select @@global.enable_xa_transaction;
32+
select * from performance_schema.global_variables where variable_name='enable_xa_transaction';
33+
select * from performance_schema.session_variables where variable_name='enable_xa_transaction';
34+
set global enable_xa_transaction='OFF';
35+
select @@global.enable_xa_transaction;
36+
select * from performance_schema.global_variables where variable_name='enable_xa_transaction';
37+
select * from performance_schema.session_variables where variable_name='enable_xa_transaction';
38+
set global enable_xa_transaction='ON';
39+
select @@global.enable_xa_transaction;
40+
select * from performance_schema.global_variables where variable_name='enable_xa_transaction';
41+
select * from performance_schema.session_variables where variable_name='enable_xa_transaction';
42+
--error ER_GLOBAL_VARIABLE
43+
set session enable_xa_transaction=0;
44+
--error ER_GLOBAL_VARIABLE
45+
set @@session.enable_xa_transaction=1;
46+
47+
#
48+
# incorrect types
49+
#
50+
--error ER_WRONG_TYPE_FOR_VAR
51+
set global enable_xa_transaction=1.1;
52+
--error ER_WRONG_TYPE_FOR_VAR
53+
set global enable_xa_transaction=1e1;
54+
--error ER_WRONG_VALUE_FOR_VAR
55+
set global enable_xa_transaction=3;
56+
select @@global.enable_xa_transaction;
57+
--error ER_WRONG_VALUE_FOR_VAR
58+
set global enable_xa_transaction=-3;
59+
select @@global.enable_xa_transaction;
60+
--error ER_WRONG_VALUE_FOR_VAR
61+
set global enable_xa_transaction='AUTO';
62+
63+
#
64+
# Cleanup
65+
#
66+
67+
SET @@global.enable_xa_transaction = @start_global_value;
68+
SELECT @@global.enable_xa_transaction;

‎mysql-test/t/xa_detach_on_prepare_off.test‎

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -824,6 +824,25 @@ XA RECOVER;
824824
# executed when global transaction is in the NON-EXISTING state
825825
XA ROLLBACK 'xid1';
826826

827+
--echo # Test disabling XA transactions
828+
829+
set @enable_xa_transaction_saved=@@global.enable_xa_transaction;
830+
set global enable_xa_transaction=0;
831+
832+
--error ER_XAER_INVAL
833+
XA START 'xid1';
834+
835+
--error ER_XAER_INVAL
836+
XA END 'xid1';
837+
838+
--error ER_XAER_INVAL
839+
XA PREPARE 'xid1';
840+
841+
--error ER_XAER_INVAL
842+
XA ROLLBACK 'xid1';
843+
844+
set global enable_xa_transaction=@enable_xa_transaction_saved;
845+
827846
--echo #
828847
--echo # BUG 31030205 - XA PREPARED TXN WILL STAY AS "RECOVERED TRX" IF ROLLBACK
829848
--echo # XID HAS WRONG FORMATID

‎sql/mysqld.cc‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1226,6 +1226,7 @@ ulong log_error_verbosity = 3; // have a non-zero value during early start-up
12261226
bool opt_keyring_migration_to_component = false;
12271227
bool opt_persist_sensitive_variables_in_plaintext{true};
12281228
ulong slave_tx_isolation;
1229+
bool enable_xa_transaction;
12291230
bool enable_binlog_hlc = 0;
12301231
bool maintain_database_hlc = false;
12311232
ulong wait_for_hlc_timeout_ms = 0;

‎sql/mysqld.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -664,6 +664,7 @@ ulonglong reset_peak(std::atomic<ulonglong> *peak,
664664
extern uint host_cache_size;
665665
extern ulong log_error_verbosity;
666666
extern ulong slave_tx_isolation;
667+
extern bool enable_xa_transaction;
667668

668669
/* Enable logging queries to a unix local datagram socket */
669670
extern bool log_datagram;

‎sql/sys_vars.cc‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5857,6 +5857,11 @@ static Sys_var_transaction_isolation Sys_slave_tx_isolation(
58575857
GLOBAL_VAR(slave_tx_isolation), CMD_LINE(REQUIRED_ARG), tx_isolation_names,
58585858
DEFAULT(ISO_REPEATABLE_READ), NO_MUTEX_GUARD, NOT_IN_BINLOG, nullptr);
58595859

5860+
static Sys_var_bool Sys_enable_xa_transaction("enable_xa_transaction",
5861+
"Enable XA transactions",
5862+
GLOBAL_VAR(enable_xa_transaction),
5863+
CMD_LINE(OPT_ARG), DEFAULT(true));
5864+
58605865
/**
58615866
Function to check if the state of 'transaction_read_only' can be changed.
58625867
The state cannot be changed if there is already a transaction in progress.

‎sql/xa/sql_xa_commit.cc‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "sql/clone_handler.h" // Clone_handler::XA_Operation
2727
#include "sql/debug_sync.h" // DEBUG_SYNC
2828
#include "sql/handler.h" // commit_owned_gtids
29+
#include "sql/mysqld.h" // enable_xa_transaction
2930
#include "sql/raii/sentry.h" // raii::Sentry<>
3031
#include "sql/rpl_gtid.h" // gtid_state_commit_or_rollback
3132
#include "sql/sql_class.h" // THD
@@ -76,6 +77,11 @@ bool Sql_cmd_xa_commit::execute(THD *thd) {
7677
}
7778

7879
bool Sql_cmd_xa_commit::trans_xa_commit(THD *thd) {
80+
if (!enable_xa_transaction) {
81+
my_error(ER_XAER_INVAL, MYF(0));
82+
return true;
83+
}
84+
7985
auto xid_state = thd->get_transaction()->xid_state();
8086

8187
assert(!thd->slave_thread || xid_state->get_xid()->is_null() ||

‎sql/xa/sql_xa_end.cc‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "mysql/psi/mysql_transaction.h" // MYSQL_SET_TRANSACTION_XA_STATE
2525
#include "mysqld_error.h" // Error codes
2626
#include "sql/debug_sync.h" // DEBUG_SYNC
27+
#include "sql/mysqld.h" // enable_xa_transaction
2728
#include "sql/sql_class.h" // THD
2829
#include "sql/transaction_info.h" // Transaction_ctx
2930

@@ -46,6 +47,11 @@ bool Sql_cmd_xa_end::trans_xa_end(THD *thd) {
4647
XID_STATE *xid_state = thd->get_transaction()->xid_state();
4748
DBUG_TRACE;
4849

50+
if (!enable_xa_transaction) {
51+
my_error(ER_XAER_INVAL, MYF(0));
52+
return true;
53+
}
54+
4955
/* TODO: SUSPEND and FOR MIGRATE are not supported yet. */
5056
if (m_xa_opt != XA_NONE)
5157
my_error(ER_XAER_INVAL, MYF(0));

0 commit comments

Comments
 (0)