規避方式:
縮小事務的語句數量
調整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一緻性讀,但某些情況下又不是,這些内容在後面的章節中将會做進一步介紹。