天天看點

httpwebrequest逾時時間timeout設定無效_MySQL資料庫innodb_rollback_on_timeout參數

httpwebrequest逾時時間timeout設定無效_MySQL資料庫innodb_rollback_on_timeout參數

在使用MySQL資料庫時,有時會出現ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction 這樣的報錯。而在一個事務中,如果其中一條sql執行時出現此報錯,對本事務的其他腳本是否有影響呢,後面如果執行commit操作,報錯之前語句的結果是否成功呢?這個結果與隔離級别以及innodb_rollback_on_timeout參數設定有關。

注:

MySQL預設隔離級别為 REPEATABLE-READ,innodb_rollback_on_timeout為OFF,本文基于innodb表(支援事務)進行測試。

1. 準備工作

1.1 測試環境

MySQL 8.0

1.2 建立測試表及預備資料

建立一張測試表,并插入一條記錄

mysql> use testdb;
Database changed
mysql> create table test1(id int primary key,name varchar(20));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into test1 values(1,'1wdrt5');
Query OK, 1 row affected (0.00 sec)

mysql> select  * from  test1;
+----+--------+
| id | name   |
+----+--------
|  1 | 1wdrt5 |
+----+--------+
1 row in set (0.00 sec)
           

下面将根據不同的隔離級别及innodb_rollback_on_timeout啟停情況進行測試。

2. 測試過程

2.1 隔離級别REPEATABLE-READ & innodb_rollback_on_timeout =OFF

a) 測試過程:

httpwebrequest逾時時間timeout設定無效_MySQL資料庫innodb_rollback_on_timeout參數
httpwebrequest逾時時間timeout設定無效_MySQL資料庫innodb_rollback_on_timeout參數

b) 測試結果:

隔離級别REPEATABLE-READ & innodb_rollback_on_timeout =OFF (2個參數均為預設值)的情況下,即使事務中有逾時復原報錯,逾時前的sql不會復原,依舊執行成功。

2.2 隔離級别為READ-COMMITTED & innodb_rollback_on_timeout =OFF

a) 測試過程

httpwebrequest逾時時間timeout設定無效_MySQL資料庫innodb_rollback_on_timeout參數
httpwebrequest逾時時間timeout設定無效_MySQL資料庫innodb_rollback_on_timeout參數
httpwebrequest逾時時間timeout設定無效_MySQL資料庫innodb_rollback_on_timeout參數

b)測試結果:

隔離級别為READ-COMMITTED & innodb_rollback_on_timeout =OFF 情況下,即使事務中有逾時復原報錯,逾時前的sql不會復原,依舊執行成功,同2者均為預設值的情況。

2.3 隔離級别REPEATABLE-READ & innodb_rollback_on_timeout =ON

注:innodb_rollback_on_timeout不能線上修改,需要修改配置檔案後重新開機生效

測試過程:

a) 修改配置檔案,重新開機資料庫

在my.cnf檔案裡添加innodb_rollback_on_timeout=on 再重新開機資料庫即可生效

mysql> show global variables like 'transaction_isolation';
+-----------------------+-----------------+
| Variable_name         | Value           |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set (0.00 sec)

mysql> show global variables like 'innodb_rollback_on_timeout';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| innodb_rollback_on_timeout | ON    |
+----------------------------+-------+
1 row in set (0.00 sec)
           

b) 事務測試過程

httpwebrequest逾時時間timeout設定無效_MySQL資料庫innodb_rollback_on_timeout參數
httpwebrequest逾時時間timeout設定無效_MySQL資料庫innodb_rollback_on_timeout參數
httpwebrequest逾時時間timeout設定無效_MySQL資料庫innodb_rollback_on_timeout參數

c) 測試結果:

隔離級别REPEATABLE-READ & innodb_rollback_on_timeout =ON 的情況下,事務中有逾時復原報錯時,逾時前sql也會復原。

2.4 隔離級别為READ-COMMITTED & innodb_rollback_on_timeout =ON

a) 參數調整

httpwebrequest逾時時間timeout設定無效_MySQL資料庫innodb_rollback_on_timeout參數

b) 測試過程

httpwebrequest逾時時間timeout設定無效_MySQL資料庫innodb_rollback_on_timeout參數
httpwebrequest逾時時間timeout設定無效_MySQL資料庫innodb_rollback_on_timeout參數
httpwebrequest逾時時間timeout設定無效_MySQL資料庫innodb_rollback_on_timeout參數

c) 測試結果

隔離級别為READ-COMMITTED & innodb_rollback_on_timeout =ON的情況下,即使事務中有逾時復原報錯,逾時前的sql不會復原,依舊執行成功,同2者均為預設值的情況。

3. 小結

在MySQL8.0 中,僅有在隔離級别為READ-COMMITTED & innodb_rollback_on_timeout =ON情況下,事務中有逾時復原報錯時,逾時前sql也會復原。

httpwebrequest逾時時間timeout設定無效_MySQL資料庫innodb_rollback_on_timeout參數
TIPS:

1) 測試過程中可以檢視information_schema.innodb_trx表觀察事務情況,在不同的版本中事務情況不一樣.例如,隔離級别REPEATABLE-READ & innodb_rollback_on_timeout=on的情況下,MySQL5.6 中整個事務復原後會自動建立一個事務,而MySQL5.7則不會再自動建立事務。

2) 在生産環境使用中,建議将innodb_rollback_on_timeout 設定為ON。應用程式一定要做好事務控制,在一個事務出現異常時必須進行顯式rollback

微信公衆号: 資料庫幹貨鋪