資料庫的鎖,事務和事務隔離

2021-12-30 02:09:14 字數 3098 閱讀 2008

資料庫中的鎖:

鎖的種類:

按照鎖的內容上分為:表鎖,頁鎖,行鎖。innodb支援行鎖,myisam支援表鎖,berkeleydba支援頁鎖。不同的粒度

按照鎖的性質分可以分為:共享鎖(讀鎖或s鎖),獨佔鎖(寫鎖,排它鎖)(x鎖),更新鎖(u鎖)(意向鎖)

當執行select時候,加共享鎖,當insert update delete等操作時,加排它鎖。更新鎖首先對資料物件作更新鎖鎖定,這樣資料將不能被修改,但可以讀取。等到sql server確定要進行更新資料操作時,他會自動將更新鎖換為獨佔鎖,當物件上有其他鎖存在時,無法對其加更新鎖。

意向鎖是為了提高封鎖子系統的效率。該封鎖子系統支援多種封鎖粒度。原因是:在多粒度封鎖方法中乙個資料物件可能以兩種方式加鎖 ― 顯式封鎖和隱式封鎖。

資料庫引擎使用意向鎖來保護鎖層次結構的底層資源,以防止其他事務對自己鎖住的資源造成傷害,提高鎖衝突檢測效能。例如,當讀取表裡的頁面時,在請求頁共享鎖(s鎖)之前,事務在表級請求共享意向鎖。這樣可以防止其他事務隨後在表上獲取排他鎖(x鎖),修改整個**。意向鎖可以提高效能,因為資料庫引擎僅在表級檢查意向鎖,確定事務是否能安全地獲取該錶上的鎖,而不需要檢查表中的每行或每頁上的鎖以確定事務是否可以鎖定整個表。

悲觀鎖與樂觀鎖

1、悲觀鎖

正如其名,它指的是對資料被外界(包括本系統當前的其他事務,以及來自外部系統的事務處理)修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制(也只有資料庫層提供的鎖機制才能真正保證資料訪問的排他性,否則,即使在本系統中實現了加鎖機制,也無法保證外部系統不會修改資料)。

2、樂觀鎖( optimistic locking )

相對悲觀鎖而言,樂觀鎖機制採取了更加寬鬆的加鎖機制。悲觀鎖大多數情況下依靠資料庫的鎖機制實現,以保證操作最大程度的獨占性。但隨之而來的就是資料庫效能的大量開銷,特別是對長事務而言,這樣的開銷往往無法承受。

而樂觀鎖機制在一定程度上解決了這個問題。樂觀鎖,大多是基於資料版本( version )記錄機制實現。何謂資料版本?即為資料增加乙個版本標識,在基於資料庫表的版本解決方案中,一般是通過為資料庫表增加乙個 「version」 欄位來實現。讀取出資料時,將此版本號一同讀出,之後更新時,對此版本號加一。此時,將提交資料的版本資料與資料庫表對應記錄的當前版本資訊進行比對,如果提交的資料版本號大於資料庫表當前版本號,則予以更新,否則認為是過期資料。

事務資料庫事務(transaction)是指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。一方面,當多個應用程式併發訪問資料庫時,事務可以在應用程式間提供乙個隔離方法,防止互相干擾。另一方面,事務為資料庫操作序列提供了乙個從失敗恢復正常的方法。

事務的四個特性

事務具有四個特性:原子性(atomicity)、一致性(consistency)、隔離型(isolation)、永續性(durability),簡稱acid。

原子性(atomicity) 事務的原子性是指事務中的操作不可拆分,只允許全部執行或者全部不執行。

一致性(consistency) 事務的一致性是指事務的執行不能破壞資料庫的一致性,一致性也稱為完整性。乙個事務在執行後,資料庫必須從乙個一致性狀態轉變為另乙個一致性狀態。

隔離性(isolation) 事務的隔離型是指併發的事務相互隔離,不能互相干擾。

永續性(durability) 事務的永續性是指事務一旦提交,對資料的狀態變更應該被永久儲存。

資料庫隔離級別

對於同時執行的多個事務,當這些事務訪問資料庫中相同的資料時,如果沒有採取必要的隔離機制,就會導致各種併發問題:

髒讀:對於兩個事務t1,t2,t1讀取了已經被t2更新但還沒有提交的字段,之後,若t2回滾,t1讀取到的內容就是臨時無效的內容。

不可重複讀:對於事務t1,t2,t1需要讀取乙個字段兩次,在第一次和第二次讀取之間,t2更新了該字段,導致t1第二次讀取到的內容值不同。

幻讀: 事務a讀取與搜尋條件相匹配的若干行。事務b以插入或刪除行等方式來修改事務a的結果集,然後再提交。 幻讀與不可重複讀之間的區別是幻讀強調的是新增或刪除,而不可重複讀強調的是修改。比如mary兩次查工資,中間有人改過工資,則兩次結果不一樣,這就是不可重複讀。mary要查工資一千的人數,第一次查到了10個,中間有人增加了一條工資為一千的人,下次查的時候就變成了11個,好像第一次查詢的是幻覺一樣。

事務的四個隔離級別 實際工作中事務幾乎都是併發的,完全做到互相之間不干擾會嚴重犧牲效能,為了平衡隔離型和效能,sql92規範定義了四個事務隔離級別:讀未提交(read uncommitted)、讀已提交(read committed)、可重複讀(repeatable read)、序列化(serializable)。四個級別逐漸增強,每個級別解決上個級別的乙個問題。

讀未提交(read uncommitted) 另乙個事務修改了資料,但尚未提交,而本事務中的select會讀到這些未被提交的資料(髒讀)。 髒讀是指另乙個事務修改了資料,但尚未提交,而本事務中的select會讀到這些未被提交的資料。

讀已提交(read committed) 本事務讀取到的是最新的資料(其他事務提交後的)。問題是,在同乙個事務裡,前後兩次相同的select會讀到不同的結果(不可重複讀)。

不可重複讀是指同乙個事務執行過程中,另外乙個事務提交了新資料,因此本事務先後兩次讀到的資料結果會不一致。

可重複讀(repeatable read) 在同乙個事務裡,select的結果是事務開始時間點的狀態,同樣的select操作讀到的結果會是一致的。但是,會有幻讀現象。

可重複讀保證了同乙個事務裡,查詢的結果都是事務開始時的狀態(一致性)。但是,如果另乙個事務同時提交了新資料,本事務再更新時,就會發現了這些新資料,貌似之前讀到的資料是幻覺,這就是幻讀。

序列化(serializable) 所有事務只能乙個接乙個序列執行,不能併發。

隔離級別的選擇

事務隔離級別越高,越能保證資料的一致性,但對併發效能影響越大,一致性和高效能必須有所取捨或折中。

一般情況下,多數應用程式可以選擇將資料庫的隔離級別設定為讀已提交,這樣可以避免髒讀,也可以得到不錯的併發效能。儘管這個隔離級別會導致不可重複度、幻讀,但這種個別場合應用程式可以通過主動加鎖進行併發控制。

oracle支援兩種隔離級別,read commited和serializable預設的事務隔離級別是read commited

mysql支援4中隔離界別,預設的是repeated read

資料庫事務隔離和鎖

資料庫事務隔離和鎖的東西,學習了一下,現講解一下自己的理解 事務 把多條sql語句作為乙個整體和資料庫互動。這裡需要注意,乙個事務可有多條sql語句,雖然這些sql語句最終的結果變成乙個整體,要成功都成功,要失敗都失敗,但是,裡面的每條sql語句卻是單條執行的。資料庫事務隔離 講的是多個事務 操作同...

資料庫鎖和事務隔離級別

建立表account create table account id int not null auto increment,name varchar 255 default null,balance int default null,primary key id engine innodb def...

資料庫事務和事務隔離級別

事務的定義很簡單,就是一組操作,這些操作要麼都執行,要麼都不執行,這一組操作是不可分割的.在資料庫中,事務具有acid特性.也就是原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 原子性是指事務是乙個不可分割的一組操作,要麼都發生,...