mysql 死鎖測試

2021-09-30 00:19:26 字數 2326 閱讀 5891

前提準備乙個測試mysql (mariadb-10.2.12)

create tabletest(

idint(11) unsigned not null auto_increment,

ageint(11) unsigned default null,

primary key (id),

unique keyage(age)

) engine=innodb default charset=utf8;

insert into test (age) values (1);

insert into test (age) values (2);

select * from test;

首先執行sql1:

start transaction;

select * from test where age=1;

–delete from test where age=1;

–commit;

後兩行是注釋掉的,這裡還沒有執行

再執行sql2:

start transaction;

delete from test where age=1;

–commit;

後一行是注釋掉的,這裡還沒有執行

然後繼續執行sql1裡面的第三行

–start transaction;

–select * from test where age=1;

delete from test where age=1;

–commit;

一三四行注釋掉了

這個時候就出現了死鎖了,通過以下語句可以檢視到:

![在這裡插入描述](

解決辦法

① 檢視並修改變數值

show global variables like 『%innodb_lock_wait_timeout%』;

set global innodb_lock_wait_timeout=100;##設定大小值看系統情況

innodb_lock_wait_timeout指的是事務等待獲取資源等待的最長時間,超過這個時間還未分配到資源則會返回應用失敗。引數的時間單位是秒,預設值50s。

② 找到一直未提交事務導致後來程序死鎖等待的程序,並殺掉

根據鎖等待表中的擁有鎖的事務id(blocking_trx_id),從innodb_trx表中找到trx_mysql_thread_id值,kill掉。

如 這裡殺掉 程序235:

select trx_mysql_thread_id from information_schema.innodb_trx it

join information_schema.innodb_lock_waits ilw

on ilw.blocking_trx_id = it.trx_id;

##trx_mysql_thread_id: 235

kill 235

③ 優化sql,優化資料庫,優化專案。第乙個update未執行完,第二個update就來了,超過等待時間就會報鎖等待超時異常。在資料併發專案遇到這種情況概率比較大,這時候就要從專案、資料庫、執行sql多方面入手了。

mysql 死鎖語句 MySQL死鎖

死鎖產生 行鎖的具體實現演算法有三種 record lock gap lock以及next key lock。record lock是專門對索引項加鎖 gap lock是對索引項之間的間隙加鎖 next key lock則是前面兩種的組合,對索引項及其之間的間隙加鎖。只在可重複讀或以上隔離級別下的特...

mysql事務死鎖 MySQL事務 死鎖

一 概念 多個事務在同一資源上互相占用形成迴路。這就是死鎖 基本命令 檢視是否自動提交事務 show variables like autocommit 設定事務是否自動提交 set autocommit 0 set autocommit 1 二 例子 create table user id bi...

mysql 死鎖模擬 mysql死鎖示例

mysql有三種鎖的級別 頁級 表級 行級。myisam和memory儲存引擎採用的是表級鎖 table level locking bdb儲存引擎採用的是頁面鎖 page level locking 但也支援表級鎖 innodb儲存引擎既支援行級鎖 row level locking 也支援表級鎖...