天天看點

mysql deadlock found_MySQL死鎖問題:Deadlockfoundwhentryingtogetlock;tryrestartingtransaction

規避方式:

縮小事務的語句數量

調整SQL語句執行順序,變“死鎖”為“鎖等待”,等待一會,總比整個事務復原掉,全部重新再執行這個流程要強.

其他.請補充

關于鎖等待:

縮小事務間SQL語句的數量,減小規模吧。當然,提高檢索速度,提高查詢時間也是首要因素,我們就發現我們的SQL語句中,有幾個沒有用到索引,導緻鎖表,導緻鎖等待發生…

事務隔離級别

在上面講到的并發事務處理帶來的問題中,“更新丢失”通常是應該完全避免的。但防止更新丢失,并不能單靠資料庫事務控制器來解決,需要應用程式對要更新的資料加必要的鎖來解決,是以,防止更新丢失應該是應用的責任。

“髒讀”、“不可重複讀”和“幻讀”,其實都是資料庫讀一緻性問題,必須由資料庫提供一定的事務隔離機制來解決。資料庫實作事務隔離的方式,基本上可分為以下兩種。

l  一種是在讀取資料前,對其加鎖,阻止其他事務對資料進行修改。

l  另一種是不用加任何鎖,通過一定機制生成一個資料請求時間點的一緻性資料快照(Snapshot),并用這個快照來提供一定級别(語句級或事務級)的一緻性讀取。從使用者的角度來看,好象是資料庫可以提供同一資料的多個版本,是以,這種技術叫做資料多版本并發控制(MultiVersion Concurrency Control,簡稱MVCC或MCC),也經常稱為多版本資料庫。

資料庫的事務隔離越嚴格,并發副作用越小,但付出的代價也就越大,因為事務隔離實質上就是使事務在一定程度上“串行化”進行,這顯然與“并發”是沖突的。同時,不同的應用對讀一緻性和事務隔離程度的要求也是不同的,比如許多應用對“不可重複讀”和“幻讀”并不敏感,可能更關心資料并發通路的能力。

為了解決“隔離”與“并發”的沖突,ISO/ANSI SQL92定義了4個事務隔離級别,每個級别的隔離程度不同,允許出現的副作用也不同,應用可以根據自己的業務邏輯要求,通過選擇不同的隔離級别來平衡“隔離”與“并發”的沖突。表20-5很好地概括了這4個隔離級别的特性。

表20-5                                             4種隔離級别比較

讀資料一緻性及允許的并發副作用

隔離級别

讀資料一緻性

髒讀

不可重複讀

幻讀

未送出讀(Read uncommitted)

最低級别,隻能保證不讀取實體上損壞的資料

已送出度(Read committed)

語句級

可重複讀(Repeatable read)

事務級

可序列化(Serializable)

最進階别,事務級

最後要說明的是:各具體資料庫并不一定完全實作了上述4個隔離級别,例如,Oracle隻提供Read committed和Serializable兩個标準隔離級别,另外還提供自己定義的Read only隔離級别;SQL Server除支援上述ISO/ANSI SQL92定義的4個隔離級别外,還支援一個叫做“快照”的隔離級别,但嚴格來說它是一個用MVCC實作的Serializable隔離級别。MySQL支援全部4個隔離級别,但在具體實作時,有一些特點,比如在一些隔離級别下是采用MVCC一緻性讀,但某些情況下又不是,這些内容在後面的章節中将會做進一步介紹。