操作场景
当一个事务长时间空闲且不提交,执行回滚操作时,会对数据库的资源和性能造成损耗。如果有大量的空闲事务长期不执行也不提交,在业务高峰期的时候发生回滚,性能损耗会较为严重。TaurusDB支持主动终止空闲事务,可针对不同类型的事务用不同的参数进行控制,当空闲事务超时后会被自动的回滚并断开连接。
参数介绍
show variables like '%idle%';
+------------------------------------+------+
| Variable_name | Value |
+-----------------------------------+-------+
| idle_readonly_transaction_timeout | 0 |
| idle_transaction_timeout | 0 |
| idle_write_transaction_timeout | 0 |
+-----------------------------------+-------+
表1 参数说明
|
参数名 |
级别 |
参数描述 |
|
idle_readonly_transaction_timeout |
global、session |
控制只读事务连接的超时时间,单位为秒。
参数设置为0时不生效,即表示只读事务连接的超时时间没有限制。 |
|
idle_transaction_timeout |
global、session |
控制一般空闲事务连接的超时时间,单位为秒。
参数设置为0时不生效,即表示一般空闲事务的连接超时时间没有限制。 |
|
idle_write_transaction_timeout |
global、session |
控制读写事务连接的超时时间,单位为秒。
参数设置为0时不生效,即表示读写事务连接的超时时间没有限制。 |
上述三个变量的关系:idle_readonly_transaction_timeout和idle_write_transaction_timeout的优先级高于idle_transaction_timeout。
图1 只读事务
图2 读写事务
示例
示例1:只读事务和读写事务超时时间为0,空闲事务不为0
设置参数:idle_transaction_timeout=10,idle_readonly_transaction_timeout=0,idle_write_transaction_timeout=0
- 只读事务
begin;
Query OK, 0 rows affected (0.00 sec)
在“idle_transaction_timeout”设置的10s范围以外执行一次查询操作,结果如下:
select * from t1;
ERROR 2013 (HY000): Lost connection to MySQL server during query
- 读写事务
使用begin开启事务之前,执行查询语句,查询结果如下:
select * from t1;
+---------+
| col_int |
+---------+
| 1 |
+---------+
1 row in set (0.00 sec)
begin;
Query OK, 0 rows affected (0.00 sec)
insert into t1 values(2);
Query OK, 1 row affected (0.00 sec)
在“idle_transaction_timeout”设置的10s范围以外执行一次查询操作,结果如下:
select * from t1;
ERROR 2013 (HY000): Lost connection to MySQL server during query
新建一个连接,执行查询语句,结果如下,表示此时事务已经回滚。
select * from t1;
+---------+
| col_int |
+---------+
| 1 |
+---------+
1 row in set (0.00 sec)
示例2:读写事务超时时间不为0
设置参数:idle_write_transaction_timeout=15
- 读写事务
使用begin开启事务之前,执行查询语句,查询结果如下:
select * from t1;
+---------+
| col_int |
+---------+
| 2 |
+---------+
1 row in set (0.00 sec)
begin;
Query OK, 0 rows affected (0.00 sec)
insert into t1 values(3);
Query OK, 1 row affected (0.00 sec)
在“idle_write_transaction_timeout”设置的15s范围以外执行一次查询操作,结果如下:
select * from t1;
ERROR 2013 (HY000): Lost connection to MySQL server during query
新建一个连接,执行查询语句,结果如下,表示此时事务已经回滚。
select * from t1;
+---------+
| col_int |
+---------+
| 2 |
+---------+
1 row in set (0.01 sec)
示例3:只读事务超时时间不为0
设置参数:idle_readonly_transaction_timeout=15
- 只读事务
begin;
Query OK, 0 rows affected (0.00 sec)
在“idle_readonly_transaction_timeout”设置的15s范围以外执行一次查询操作,结果如下:
select * from t1;
ERROR 2013 (HY000): Lost connection to MySQL server during query