一、概念:
多個事務在同一資源上互相占用形成迴路。這就是死鎖
基本命令:
#檢視是否自動提交事務
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 事物的隔離級別 資料庫中有四種資料隔離級別...