SQLserver鎖和事務隔離級別的比較與使用_第1頁
SQLserver鎖和事務隔離級別的比較與使用_第2頁
SQLserver鎖和事務隔離級別的比較與使用_第3頁
SQLserver鎖和事務隔離級別的比較與使用_第4頁
SQLserver鎖和事務隔離級別的比較與使用_第5頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、SQLserver鎖和事務隔離級別的比較與使用對象 鎖:每條SQL語句 隔離:事務鎖并發(fā)問題丟失更新未確認的讀取(臟讀)不一致的分析(非重復讀):多次讀取相同的數(shù)據(jù)(行)不一致(其他用戶更改update) 幻像讀:多次讀取有不存在和新增的數(shù)據(jù)(其他用戶插入insert或刪除delete)隔離級別是是否否 是 是 是 否 如果其他事務更新,不管是否提交,立即執(zhí)行 讀取提交過的數(shù)據(jù)。如果其他事務更新沒提交,則等待 查詢期間,不允許其他事務update 查詢期間,不允許其他事務insert或delete 未提交讀(read uncommitted) 是 提交讀(read committed默認) 否

2、 可重復讀(repeatable read) 可串行讀(serializable) 否 否提交讀假設存在表A,如下所示打開查詢分析器并打開兩個連接,分別輸入如下兩個事務:-事務SET TRANSACTION ISOLATION LEVEL READ Committedbegin tranupdate A set A2 = 20 where A1 = 11waitfor delay '00:00:10'rollback tran-事務SET TRANSACTION ISOLATION LEVEL READ Committedselect * from A where A1 = 1

3、1如果先運行事務,然后緊接著運行事務,則事務要等待10秒鐘(一個連接在修改數(shù)據(jù)塊時別的連接也不能查詢這個數(shù)據(jù)塊,直到解鎖。反之亦然:讀的時候不能寫和修改)。如果把事務改為如下SET TRANSACTION ISOLATION LEVEL READ UNCommittedselect * from A where A1 = 11那么事務不需等待,立即執(zhí)行(可以看出READ UNCommitted事務select不對數(shù)據(jù)發(fā)出共享鎖)鎖:(這里主要講解 共享鎖 和 排他鎖 兩種經常用到的鎖)共享鎖主要是為了共享讀(select),如果存在事務(一個或多個)擁有對表中數(shù)據(jù)(關于鎖數(shù)據(jù)的多少,視鎖的粒度

4、而定)的共享鎖,不允許對鎖定的數(shù)據(jù)進行更新(update)(從鎖的角度講,即不允許事務獲取排他鎖,要等到所有的共享鎖都釋放掉)。反之,如果事務對數(shù)據(jù)已經具有排他鎖(只能有一個),其他的事務就不能對鎖定的數(shù)據(jù)獲取共享鎖和排他鎖(即排他鎖與共享鎖不能兼容,更多信息請查看鎖兼容性),在此特別強調一下 鎖定的數(shù)據(jù) ,因為有的資料上講解到“一個連接寫的時候,另一個連接可以寫”,實際上寫的這種情況是各個連接的讀寫的數(shù)據(jù)不是相同的行,也就是說各個連接鎖定的數(shù)據(jù)不同。根據(jù)以上分析,我們總結為六個字為“共享讀,排他寫”。了解了鎖的情況之后,又涉及到一個問題。事務究竟要保持鎖多久呢?一般來說,共享鎖的鎖定時間與事

5、務的隔離級別有關,如果隔離級別為Read Committed的默認級別,只在讀取(select)的期間保持鎖定,即在查詢出數(shù)據(jù)以后就釋放了鎖;如果隔離級別為更高的Repeatable read或Serializable,直到事務結束才釋放鎖。另說明,如果select語句中指定了HoldLock提示,則也要等到事務結束才釋放鎖。排他鎖直到事務結束才釋放。做出了以上分析,現(xiàn)在我們可能會存在這樣的疑問,到底在執(zhí)行SQL語句的時候發(fā)出什么樣的鎖呢,這就由事務的隔離級別決定了。一般情況,讀語句(select)發(fā)出共享鎖,寫語句(update,insert,delete)發(fā)出排他鎖。但是,如果這樣不能滿足

6、我們的要求怎么辦呢,有沒有更多選擇呢,別急,SQLserver為我們提供了鎖定提示的概念。鎖定提示對SQL語句進行特別指定,這個指定將覆蓋事務的隔離級別。下面對各個鎖定提示分別予以介紹(更多資料請查看SQLserver的聯(lián)機幫助),筆者做出了以下分類。類型1 READUNCOMMITTED:不發(fā)出鎖 READCOMMITTED:發(fā)出共享鎖,保持到讀取結束 REPEATABLEREAD:發(fā)出共享鎖,保持到事務結束 SERIALIZABLE:發(fā)出共享鎖,保持到事務結束類型2 NOLOCK:不發(fā)出鎖。等同于READUNCOMMITTED HOLDLOCK:發(fā)出共享鎖,保持到事務結束。等同于SERIA

7、LIZABLE XLOCK:發(fā)出排他鎖,保持到事務結束。 UPDLOCK:發(fā)出更新鎖,保持到事務事務結束。(更新鎖:不阻塞別的事物,允許別的事物讀數(shù)據(jù)(即更新鎖可與共享鎖兼容),但他確保自上次讀取數(shù)據(jù)后數(shù)據(jù)沒有被更新) READPAST:發(fā)出共享鎖,但跳過鎖定行,它不會被阻塞。適用條件:提交讀的隔離級別,行級鎖,select語句中。類型3 ROWLOCK:行級鎖 PAGLOCK:頁級鎖 TABLOCK:表鎖 TABLOCKX:表排他鎖講解完鎖后,下面結合一個具體實例,具體看一下鎖的使用。在很多系統(tǒng)中,經常會遇到這種情況,要保持一個編號的唯一,如會計軟件中的憑證的編號。一種編號的處理是這樣的,把

8、表中的最大編號保存到表中,然后在這個編號上累加,形成新的編號。這個過程對并發(fā)處理要求非常高,下面我們就來模擬這個過程,看如何保持編號的唯一性。新建一張表code來保存憑證的最大編號。字段如下:編號:bh(numeric(18,0),憑證表名pinzheng(varchar(50)假設表中有這樣的一條記錄:新建一個存儲過程來生成新的憑證編號,如下:CREATE PROCEDURE up_getbh ASBegin TranDeclare numnewbh numeric(18,0)select numnewbh = bh FROM code WITH (UPDLOCK,ROWLOCK) wher

9、e pinzheng = '會計憑證'set numnewbh = numnewbh + 1update code set bh = numnewbh where pinzheng = '會計憑證'print numnewbhCommit tranGO然后,打開查詢分析器,并多開幾個連接(筆者開了8個連接,模擬有8個人同時并發(fā),讀者可以開更多的連接進行試驗),把類似以下這樣的語句復制到每個連接窗口中,declare i numeric(18,0)set i = 1while i = 1Beginif getdate() > '2004-07-22 14:23' -設定一個時間,到此時間同時執(zhí)行upgetbh存儲過程 set i = 0endexec up_getbh然后,接連運行各個連接,到2004-7-22 14:23 這一刻,各個連接同時運行up_getbh。從運

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論