1. 程式人生 > >Python指令碼執行Mysql語句遇到死鎖問題

Python指令碼執行Mysql語句遇到死鎖問題

關於執行指令碼出行死鎖問題現象展示
以下是第一次遇到這種問題,本人的分析過程。 a. 初步排查 對每個執行段落進行try....catch捕獲異常,先定位問題出現區域,接著對問題定位發現如下。 獲得MYSQL服務端關於innodb_lock_wait_timeout的引數50s,暫時排除因為超時設定過小導致的死鎖。 最後發現,在第一次發生死鎖的區域,連著執行兩條sql語句查詢,且都對t_organizemechanism表中的組織id對應的組織名稱進行select,可能造成了死鎖,將車輛和裝置分開執行後,執行速度明顯提升,且未在發現死鎖。

b.重啟pycharm後仍然有死鎖問題 重新對innodb_lock_wait_timeout設定成90s,針對單執行緒事務,增大超時等待時間。
執行指令碼後,成功,且速度符合預期。 至此,解決問題。 c.檢視其它解決辦法 1、鎖等待超時。是當前事務在等待其它事務釋放鎖資源造成的。可以找出鎖資源競爭的表和語句,優化你的SQL,建立索引等,如果還是不行,可以適當減少併發執行緒數。 2、你的事務在等待給某個表加鎖時超時了,估計是表正被另的程序鎖住一直沒有釋放。 可以用 SHOW INNODB STATUS/G; 看一下鎖的情況。 3、搜尋解決之道,在管理 節點的[ndbd default]區加: TransactionDeadLockDetectionTimeOut=10000(設定 為10秒)預設是1200(1.2秒) 4、InnoDB會自動的檢測死鎖進行回滾,或者終止死鎖的情況。
引用 InnoDB automatically detects transaction deadlocks and rolls back a transaction or transactions to break the deadlock. InnoDB tries to pick small transactions to roll back, where the size of a transaction is determined by the number of rows inserted, updated, or deleted. 如果引數innodb_table_locks=1並且autocommit=0時,InnoDB會留意表的死鎖,和MySQL層面的行級鎖。另外,InnoDB不會檢測MySQL的Lock Tables命令和其他儲存引擎死鎖。
你應該設定innodb_lock_wait_timeout來解決這種情況。 innodb_lock_wait_timeout是Innodb放棄行級鎖的超時時間。