前提準備乙個測試mysql (mariadb-10.2.12)
create tabletest
(
id
int(11) unsigned not null auto_increment,
age
int(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 也支援表級鎖...