花了一天時間,問題終於解決了,超有成就感。
問了一下用過mysql的同事,他分析事務死鎖的原因可能是表中資料量太大,update語句的查詢條件沒有建索引,導致事務需要掃瞄全表(此時會鎖表)。
這個原因倒是跟我的情況很相似,發生死鎖的事務裡確實有根據普通建更新記錄的語句。我查了一下資料量,測試環境200多條,生產機的測試庫和生產庫都是20萬多條,照例20萬多條不算多啊,這點資料都處理不過來?
廢話少說,先測試。在測試環境新增5萬條資料,結果死鎖重現。
現在基本斷定是這條語句:
update t_card_info set state=2 where cardno in (select cardno from t_user where mobileno='13598798770' and state=2)
因為t_user表的cardno欄位沒有索引,建個索引再測試:速度超快。
注:建索引:alter table dbname.table_name add index index_name(column_name);
刪除索引:drop index index_name on dbname.table_name;
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事務 死鎖
一 概念 多個事務在同一資源上互相占用形成迴路。這就是死鎖 基本命令 檢視是否自動提交事務 show variables like autocommit 設定事務是否自動提交 set autocommit 0 set autocommit 1 二 例子 create table user id bi...
mysql沒有事務死鎖 Mysql事務與死鎖
好久沒有寫部落格了,最近工作太忙了,真的是996icu呀。想找個機會跳出來。之後我要做到work life balance!當考慮的就是資料一致性的問題時我們用就應該想到mysql的事務。但是當我們使用事務時會有很多的坑,首先我們了解一下事務的隔離界別。1 事物的隔離級別 資料庫中有四種資料隔離級別...