mysql事務死鎖 MySQL事務 死鎖

2021-10-17 15:26:48 字數 1560 閱讀 3261

一、概念:

多個事務在同一資源上互相占用形成迴路。這就是死鎖

基本命令:

#檢視是否自動提交事務

show variables like '%autocommit%';

#設定事務是否自動提交

set @@autocommit=0;

set @@autocommit=1;

二、例子:

create table `user` (

`id` bigint(20) not null auto_increment,

`uuid` varchar(255) default null,

`name` varchar(255) default null,

`age` int(11) default null,

primary key (`id`)

) engine=innodb auto_increment=7 default charset=utf8;

insert into `user` values ('1', '66', '1', '3');

insert into `user` values ('2', '2', '2', '2');

insert into `user` values ('3', '3', '3', '3');

事務 a 想修改 id=2 的資料,但是必須要事務 b 釋放。事務 b 想要修改 id=1 的資料,同樣也在等待事務 a 的結束。

t1 時刻 a 事務執行:start transaction;select * from user where id=1 for update;

t2 時刻 b 事務執行: start transaction;select * from user where id=2 for update;

t3 時刻 a 事務執行:update user set id=id where id=2;

t4 時刻 b 事務執行:update user set id=id where id=1;

結束事務命令:commit

三、預防手段:

innodb_lock_wait_timeout innodb 的鎖超時等待引數

show global variables like 'innodb_lock_wait_timeout';

set global innodb_lock_wait_timeout=100;

合理設計索引

降低隔離級別(看業務是否允許)

大事務拆小,盡量一次性把鎖拿全

四、定位死鎖:

檢視隔離級別 select @@tx_isolation;

檢視當前執行緒 show processlist;

返回結果中包括死鎖相關事務的詳細資訊,如引發死鎖的 sql 語句,事務已經獲得的鎖,正在等待什麼鎖,以及被回滾的事務等。據此可以分析死鎖產生的原因和改進措施。

show engine innodb status;

重要的三張鎖的監控表innodb_trx,innodb_locks,innodb_lock_waits,tables_in_information_schema資料庫下,如果出現死鎖這裡面會有資料

mysql 事務死鎖問題

花了一天時間,問題終於解決了,超有成就感。問了一下用過mysql的同事,他分析事務死鎖的原因可能是表中資料量太大,update語句的查詢條件沒有建索引,導致事務需要掃瞄全表 此時會鎖表 這個原因倒是跟我的情況很相似,發生死鎖的事務裡確實有根據普通建更新記錄的語句。我查了一下資料量,測試環境200多條...

mysql 事務 死鎖問題

mysql 事務 死鎖問題復現 第乙個事務刪除並插入,未提交 begin delete from t option value rel resource where field id 1 and data id 1 insert into t option value rel resource id...

mysql沒有事務死鎖 Mysql事務與死鎖

好久沒有寫部落格了,最近工作太忙了,真的是996icu呀。想找個機會跳出來。之後我要做到work life balance!當考慮的就是資料一致性的問題時我們用就應該想到mysql的事務。但是當我們使用事務時會有很多的坑,首先我們了解一下事務的隔離界別。1 事物的隔離級別 資料庫中有四種資料隔離級別...