Commit 5a9ba869 authored by Sergei Golubchik's avatar Sergei Golubchik

Added read only system variable 'in_transaction' which tells if there's

an active transaction.

fixed a bug - not clearing "in transaction" status on set @@autocommit=1
parent e696da7b
...@@ -186,4 +186,33 @@ bytes_sent <> 0, binlog_bytes_written <> 0 ...@@ -186,4 +186,33 @@ bytes_sent <> 0, binlog_bytes_written <> 0
from information_schema.client_statistics; from information_schema.client_statistics;
connected_time <> 0 busy_time <> 0 bytes_received <> 0 bytes_sent <> 0 binlog_bytes_written <> 0 connected_time <> 0 busy_time <> 0 bytes_received <> 0 bytes_sent <> 0 binlog_bytes_written <> 0
1 1 1 1 1 1 1 1 1 1
create table t1 (a int) engine=innodb;
select @@in_transaction;
@@in_transaction
0
begin;
select @@in_transaction;
@@in_transaction
1
insert into t1 values (1);
select @@in_transaction;
@@in_transaction
1
commit;
select @@in_transaction;
@@in_transaction
0
set @@autocommit=0;
select @@in_transaction;
@@in_transaction
0
insert into t1 values (2);
select @@in_transaction;
@@in_transaction
1
set @@autocommit=1;
select @@in_transaction;
@@in_transaction
0
drop table t1;
set @@global.general_log=@save_general_log; set @@global.general_log=@save_general_log;
...@@ -85,5 +85,25 @@ select connected_time <> 0, busy_time <> 0, bytes_received <> 0, ...@@ -85,5 +85,25 @@ select connected_time <> 0, busy_time <> 0, bytes_received <> 0,
bytes_sent <> 0, binlog_bytes_written <> 0 bytes_sent <> 0, binlog_bytes_written <> 0
from information_schema.client_statistics; from information_schema.client_statistics;
#
# Test of in transaction
#
create table t1 (a int) engine=innodb;
select @@in_transaction;
begin;
select @@in_transaction;
insert into t1 values (1);
select @@in_transaction;
commit;
select @@in_transaction;
set @@autocommit=0;
select @@in_transaction;
insert into t1 values (2);
select @@in_transaction;
set @@autocommit=1;
select @@in_transaction;
drop table t1;
# Cleanup # Cleanup
set @@global.general_log=@save_general_log; set @@global.general_log=@save_general_log;
...@@ -156,6 +156,7 @@ static bool sys_update_slow_log_path(THD *thd, set_var * var); ...@@ -156,6 +156,7 @@ static bool sys_update_slow_log_path(THD *thd, set_var * var);
static void sys_default_slow_log_path(THD *thd, enum_var_type type); static void sys_default_slow_log_path(THD *thd, enum_var_type type);
static void fix_sys_log_slow_filter(THD *thd, enum_var_type); static void fix_sys_log_slow_filter(THD *thd, enum_var_type);
static uchar *get_myisam_mmap_size(THD *thd); static uchar *get_myisam_mmap_size(THD *thd);
static uchar *in_transaction(THD *thd);
static int check_max_allowed_packet(THD *thd, set_var *var); static int check_max_allowed_packet(THD *thd, set_var *var);
static int check_net_buffer_length(THD *thd, set_var *var); static int check_net_buffer_length(THD *thd, set_var *var);
...@@ -997,6 +998,12 @@ static sys_var_enum_const sys_plugin_maturity(&vars, "plugin_maturity", ...@@ -997,6 +998,12 @@ static sys_var_enum_const sys_plugin_maturity(&vars, "plugin_maturity",
&plugin_maturity, &plugin_maturity,
&plugin_maturity_values); &plugin_maturity_values);
static sys_var_readonly sys_in_transaction(&vars, "in_transaction",
OPT_SESSION, SHOW_BOOL,
in_transaction);
bool sys_var::check(THD *thd, set_var *var) bool sys_var::check(THD *thd, set_var *var)
{ {
var->save_result.ulonglong_value= var->value->val_int(); var->save_result.ulonglong_value= var->value->val_int();
...@@ -3269,35 +3276,26 @@ static bool set_option_log_bin_bit(THD *thd, set_var *var) ...@@ -3269,35 +3276,26 @@ static bool set_option_log_bin_bit(THD *thd, set_var *var)
static bool set_option_autocommit(THD *thd, set_var *var) static bool set_option_autocommit(THD *thd, set_var *var)
{ {
/* The test is negative as the flag we use is NOT autocommit */ ulonglong new_options= thd->options;
ulonglong org_options= thd->options;
if (var->save_result.ulong_value != 0) /* The test is negative as the flag we use is NOT autocommit */
thd->options&= ~((sys_var_thd_bit*) var->var)->bit_flag; if (var->save_result.ulong_value)
new_options&= ~OPTION_NOT_AUTOCOMMIT;
else else
thd->options|= ((sys_var_thd_bit*) var->var)->bit_flag; new_options|= OPTION_NOT_AUTOCOMMIT;
if ((org_options ^ thd->options) & OPTION_NOT_AUTOCOMMIT) if ((new_options ^ thd->options) & OPTION_NOT_AUTOCOMMIT)
{ {
if ((org_options & OPTION_NOT_AUTOCOMMIT)) if ((thd->options & OPTION_NOT_AUTOCOMMIT))
{ {
/* We changed to auto_commit mode */ if (end_active_trans(thd))
if (thd->transaction.xid_state.xa_state != XA_NOTR)
{
thd->options= org_options;
my_error(ER_XAER_RMFAIL, MYF(0),
xa_state_names[thd->transaction.xid_state.xa_state]);
return 1; return 1;
}
thd->options&= ~(ulonglong) (OPTION_BEGIN | OPTION_KEEP_LOG);
thd->transaction.all.modified_non_trans_table= FALSE;
thd->server_status|= SERVER_STATUS_AUTOCOMMIT; thd->server_status|= SERVER_STATUS_AUTOCOMMIT;
if (ha_commit(thd)) thd->options= new_options;
return 1;
} }
else else
{ {
thd->options= new_options;
thd->transaction.all.modified_non_trans_table= FALSE; thd->transaction.all.modified_non_trans_table= FALSE;
thd->server_status&= ~SERVER_STATUS_AUTOCOMMIT; thd->server_status&= ~SERVER_STATUS_AUTOCOMMIT;
} }
...@@ -3399,6 +3397,12 @@ static uchar *get_myisam_mmap_size(THD *thd) ...@@ -3399,6 +3397,12 @@ static uchar *get_myisam_mmap_size(THD *thd)
return (uchar *)&myisam_mmap_size; return (uchar *)&myisam_mmap_size;
} }
static uchar *in_transaction(THD *thd)
{
thd->sys_var_tmp.my_bool_value=
test(thd->server_status & SERVER_STATUS_IN_TRANS);
return (uchar*) &thd->sys_var_tmp.my_bool_value;
}
/**************************************************************************** /****************************************************************************
Main handling of variables: Main handling of variables:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment