my18_mysql中的幾個超時時間


連接的超時時間

set global interactive_timeout=120;
set global wait_timeout=120;

該連接指類似應用訪問數據庫的連接,可以是查詢、DML、DDL等

測試一:超時后,DML事務斷開,相當於事務提交失敗,原數據無變化

mysql> select sysdate();begin;update test set tvalue='123' where test_id=5;
+---------------------+
| sysdate()           |
+---------------------+
| 2018-09-22 11:08:45 |
+---------------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select sysdate();commit;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    344
Current database: vodb

+---------------------+
| sysdate()           |
+---------------------+
| 2018-09-22 11:10:47 |
+---------------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> select test_id,tvalue from test;
+---------+-----------------------------------------------------------------------------+
| test_id | tvalue                                                                      |
+---------+-----------------------------------------------------------------------------+
|       1 | 有張有馳有分寸0                                                             |
|       2 | 適當休息有利於提高工作效率                                                  |
|       3 | 人類對事物的看法達成一致時,可以形成精神層面的共鳴                          |
|       4 | 有張有馳有分寸3                                                             |
|       5 | 456                                                                         |
+---------+-----------------------------------------------------------------------------+
5 rows in set (0.00 sec)

注意:超時后會出現,下面的信息,后面的連接是客戶端自己又重新連接的,事務已經失效了

ERROR 2006 (HY000): MySQL server has gone away

 下面是在連接120時間內提交,事務就會成功

mysql> select test_id,tvalue from test;
+---------+-----------------------------------------------------------------------------+
| test_id | tvalue                                                                      |
+---------+-----------------------------------------------------------------------------+
|       1 | 有張有馳有分寸0                                                             |
|       2 | 適當休息有利於提高工作效率                                                  |
|       3 | 人類對事物的看法達成一致時,可以形成精神層面的共鳴                          |
|       4 | 有張有馳有分寸3                                                             |
|       5 | 456                                                                         |
+---------+-----------------------------------------------------------------------------+
5 rows in set (0.00 sec)

mysql> 
mysql> 
mysql> select sysdate();begin;update test set tvalue='123' where test_id=5;
+---------------------+
| sysdate()           |
+---------------------+
| 2018-09-22 11:32:55 |
+---------------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select sysdate();commit;
+---------------------+
| sysdate()           |
+---------------------+
| 2018-09-22 11:34:14 |
+---------------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.09 sec)

mysql> select test_id,tvalue from test;
+---------+-----------------------------------------------------------------------------+
| test_id | tvalue                                                                      |
+---------+-----------------------------------------------------------------------------+
|       1 | 有張有馳有分寸0                                                             |
|       2 | 適當休息有利於提高工作效率                                                  |
|       3 | 人類對事物的看法達成一致時,可以形成精神層面的共鳴                          |
|       4 | 有張有馳有分寸3                                                             |
|       5 | 123                                                                         |
+---------+-----------------------------------------------------------------------------+
5 rows in set (0.00 sec)

 

參數的設置需要需要下面兩個參數一起設置,注意查看是否生效的時候,要使用show global variables like '%timeout'; 

set global interactive_timeout=120;
set global wait_timeout=120;

測試二:wait_timeout是空閑連接的超時時間,如果一個連接正在query,而不是sleep狀態,則超時也不會斷開

set global interactive_timeout=60;
set global wait_timeout=60;

set interactive_timeout=60;
set wait_timeout=60;

test表有5萬數據,正在不斷插入數據,自連接進行笛卡爾集查詢,時間遠遠超過了連接的超時設置60,但連接並沒有斷開,所以這里的連接指的是空連接;

mysql> select count(aa.tvalue) from test aa,test bb where aa.tid=bb.tid ;
+------------------+
| count(aa.tvalue) |
+------------------+
|            50015 |
+------------------+
1 row in set (2 min 58.55 sec)

 

 

DDL鎖超時時間

mysql> set global lock_wait_timeout=5;
Query OK, 0 rows affected (0.11 sec)

mysql> 
mysql> 
mysql> show global variables like '%lock_wait%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| innodb_lock_wait_timeout | 50    |
| lock_wait_timeout        | 5     |
+--------------------------+-------+
2 rows in set (0.51 sec)

修改DDL超時時間為5秒,結果很悲劇,5秒時該DDL未執行完,mysql實例直接關閉了,這個參數的默認時間31536000秒(365天),最好還是不要改動了

mysql> alter table test drop column beizhu;
ERROR 2013 (HY000): Lost connection to MySQL server during query

 

DML事務鎖超時時間

set global innodb_lock_wait_timeout=30;

set innodb_lock_wait_timeout=30;

一個innodb事務等待一個row lock的秒數,超時這個秒數,則該innodb事務就不再等了,直接回退了。此處設置為30秒,實驗如下

會話一,事務持續超過了30秒,在這中間執行了會話二

mysql> select sysdate();begin;update test set tvalue='一些小的痛苦可以引人思考,讓人成長;但長時間深陷痛苦之中,則會傷害身心' where test_id=4;
+---------------------+
| sysdate()           |
+---------------------+
| 2018-09-22 22:13:25 |
+---------------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select sysdate();commit;
+---------------------+
| sysdate()           |
+---------------------+
| 2018-09-22 22:14:03 |
+---------------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.01 sec)

會話二,在會話一執行的中間執行,在第31秒時,出現了 lock wait timeout,然后原數據並未變化,也就是說事務回退了

mysql> select sysdate();update test set tvalue='小痛助長,大痛傷身' where test_id=4;
+---------------------+
| sysdate()           |
+---------------------+
| 2018-09-22 22:13:30 |
+---------------------+
1 row in set (0.00 sec)

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql> select tid,tvalue from test where test_id<6;
+------+-----------------------------------------------------------------------------------------------------------+
| tid  | tvalue                                                                                                    |
+------+-----------------------------------------------------------------------------------------------------------+
|    0 | 有張有馳有分寸0                                                                                           |
|    1 | 適當休息有利於提高工作效率                                                                                |
|    2 | 人類對事物的看法達成一致時,可以形成精神層面的共鳴                                                        |
|    3 | 一些小的痛苦可以引人思考,讓人成長;但長時間深陷痛苦之中,則會傷害身心                                    |
|    4 | 123                                                                                                       |
+------+-----------------------------------------------------------------------------------------------------------+
5 rows in set (0.00 sec)

注意,這是說一個事務等待一個row lock的最大時間,但是事務本身需要很久的時間是沒有問題的,是可以執行成功的;同時也說明,一個長事務有讓其他的事務失效回退的可能。本例是Mysql7.2.22,RR事務隔離級別。

test表已有120萬數據量(還在不斷插入數據中),讓它自己跟自己笛卡爾一下就能產生個長事務,test_id是索引字段,tid上無索引,這是在全表所有row的tid列上加鎖

mysql> update test aa,test bb set aa.tid=bb.test_id where bb.tid = aa.tid;

下面的這個事務在等待30秒后,就自動回退了,這就是長事務阻斷了其他事務的情況

mysql> update test aa set aa.tid = 7 where aa.tid=8;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM