MySQL資料庫執行Update卡死問題怎麼解決

WBOY
發布: 2023-05-26 19:07:05
轉載
2810 人瀏覽過

問題分析

一般都是資料庫事務未提交,導致update或delete卡死。

解決方案

  1. 執行完更新或刪除後,記得將交易提交commit;

  2. 找到資料庫用戶端,執行commit操作。

如果還不行。當資料庫執行資料操作失敗或交易未提交時,它會鎖定需要執行的SQL語句。

流程復現與解決

透過以下指令查看資料庫的自動提交狀態

show variables like 'autocommit';
登入後複製

透過SQL設定資料庫自動自動提交關閉

-- on为开启,off为关闭
set autocommit=off;
-- 或者1为开启,0为关闭
set autocommit=0;
登入後複製

表中資料如下:

MySQL資料庫執行Update卡死問題怎麼解決

開啟兩個視窗分別執行update操作

update car set color ='银色' where id = 1;
update car set color ='红色' where id = 1;
登入後複製

#查詢正在執行的交易:##

SELECT * FROM information_schema.INNODB_TRX;
登入後複製

MySQL資料庫執行Update卡死問題怎麼解決

根據圖中事務的執行緒ID(trx_mysql_thread_id)可以看出對應的mysql 執行緒:一個1084 (update正在等待鎖定)另一個是1089(update 正在執行沒有提交交易)

可以使用mysql指令殺掉執行緒:kill 執行緒id

kill 1089;
登入後複製

期間如果並未殺掉持有鎖的執行緒:則第二個update語句會提示等待鎖定逾時。

MySQL資料庫執行Update卡死問題怎麼解決

相關指令:

-- 查看正在锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS; 

-- 查看等待锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
-- 查询mysql数据库中存在的进程
select * from information_schema.`PROCESSLIST`(show processlist;)
登入後複製

擴充

oracle的操作方式:

查詢鎖定記錄

SELECT s.sid, s.serial# FROM v$locked_object lo, dba_objects ao, v$session s WHERE ao.object_id = lo.object_id AND lo.session_id = s.sid;
登入後複製

刪除鎖定記錄

ALTER system KILL session 'SID,serial#';
登入後複製

以上是MySQL資料庫執行Update卡死問題怎麼解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!