本文主要介紹事務隔離級別與數(shù)據(jù)庫中鎖的對應關系(數(shù)據(jù)庫中的事務隔離分為四個級別 其中允許不可重復讀取),下面一起看看事務隔離級別與數(shù)據(jù)庫中鎖的對應關系(數(shù)據(jù)庫中的事務隔離分為四個級別 其中允許不可重復讀取)相關資訊。
鎖機制nolock和readpast的區(qū)別。1。打開一個事務來執(zhí)行插入數(shù)據(jù)的操作。開始t插入客戶選擇amp。;a , 2.執(zhí)行查詢語句。choose * from the customer(no lock)one是結果。當事務回滾時,臟數(shù)據(jù)將被刪除。(注意:1個事務未提交),是否意味著不會在數(shù)據(jù)表中添加共享鎖,以防止其他事務修改數(shù)據(jù)表中的數(shù)據(jù)?select from customers *該語句將保持死鎖狀態(tài),直到鎖被刪除或鎖定。(注:設置鎖超時設置lock _ time out 1800)select * read past。該語句將顯示提交前的狀態(tài),但不會鎖定整個表。此提示指示當數(shù)據(jù)庫引擎返回結果時,將忽略鎖定的行或數(shù)據(jù)頁。3.執(zhí)行insert語句。begintran t插入客戶選擇amp。;b,b此時通過t提交,即使回滾步驟1中的事務,數(shù)據(jù)也會丟失,而b繼續(xù)插入數(shù)據(jù)庫。諾洛克1號.執(zhí)行下面的語句。開始tran ttt選擇*提交客戶的tran ttt(沒有鎖定)等待延遲 00 : 00 : 20注意:后面不加鎖,可以加刪除不鎖。插入客戶選擇 解鎖刪除客戶id = 1-解鎖選擇*從客戶解鎖標題更新客戶設置= aa 其中id = 1解鎖槳架1。使用行鎖來執(zhí)行查詢。設置交易隔離級別為重復讀取(必要的),并開始tran ttt選擇*提交tran ttt從客戶(槳架)的id是17等待延遲 00 : 00 : 20注意:當您刪除和更新您正在查詢的數(shù)據(jù)時,您鎖定了這些數(shù)據(jù)。對其他行的查詢數(shù)據(jù)沒有影響,只是增加了查詢。插入客戶選擇 a,b-don ;t等待刪除id = 17-等待客戶刪除id小于17的客戶。;不要等待顧客的選擇。;t等待更新客戶設置title = aa 其中id = 17,等等。更新客戶設置標題= aa id17 don ;t等待holdlock、tablock和ta block 1。執(zhí)行holdlock啟動tran ttt選擇* holdlock) wa。它的延遲和。;00 : 00 : 10提交tran ttt注意:其他事務可以讀表,但不能更新和刪除。更新客戶設置title =aa-等待10秒鐘。select * from customers-無需等待2。執(zhí)行tablocx開始tran ttt選擇*提交客戶的tran ttt。;00 : 00 : 10注意:其他事務不能讀表,更新,刪除。更新客戶設置title =aa-等待10秒鐘。從客戶處選擇*并等待10秒鐘。3.執(zhí)行塔布洛克開始tran ttt選擇*提交客戶tran ttt(塔布洛克)等待延遲 00 : 00 : 10注意:其他事務可以讀表,但不能更新和刪除。更新客戶設置title =aa-等待10秒鐘。select * from customers-無需等待udplock 1。在連接中執(zhí)行。開始tran ttt選擇*提交客戶的tran ttt 2。;00 : 00 : 10 .在其他連接中執(zhí)行。更新客戶設置標題= aa 其中id = 1-等待10秒鐘從客戶中選擇。;迫不及待地插入客戶選擇 a,b唐 t wait注意:它是一個udplock,只是更新數(shù)據(jù)鎖。注意:使用這些選項將導致系統(tǒng)忽略最初在set語句中設置的事務隔離級別(set transaction isolation level)。事務隔離級別臟讀:未讀臟讀是指當事務訪問數(shù)據(jù)并修改數(shù)據(jù)時,修改尚未提交到數(shù)據(jù)庫。同時,另一個事務也訪問數(shù)據(jù),然后使用它。因為此數(shù)據(jù)尚未提交,所以另一個事務讀取的數(shù)據(jù)是臟的,基于臟數(shù)據(jù)的操作可能不正確。1。在連接中執(zhí)行。開始插入客戶 的選擇 123 , 等待延遲 00 : 00 : 20并通過t 2提交。在連接b中執(zhí)行。設置事務隔離級別并選擇* from customers。此時,未提交的數(shù)據(jù)將顯示在 123,導致事務回滾時出現(xiàn)臟數(shù)據(jù)。相當于(nolock)提交讀取:讀取提交1。在連接中執(zhí)行。開始t插入客戶選擇 123 , 等待延遲 00 : 00 : 20并提交給t 2。在連接b中執(zhí)行。設置事務隔離級別并選擇* from customers。此時,未提交的數(shù)據(jù)將不會顯示在 123 ,并且可以讀取數(shù)據(jù)。乙方提交交易后,會避免臟讀。can 不能反復閱讀:可以反復閱讀,可以 t重復讀取是指在一個事務中多次讀取相同的數(shù)據(jù)。當這個事務沒有完成時,另一個事務訪問相同的數(shù)據(jù)。由于在兩個事務中讀取的數(shù)據(jù)的第二事務性質(zhì),在第一事務中讀取的數(shù)據(jù)(兩次來自第一事務)可能不同。當這一切發(fā)生時,在一個事務中讀取兩次數(shù)據(jù)是不一樣的,所以稱為不可重復讀取。例如,:一號。在連接中執(zhí)行以下語句。為重復讀取設置事務隔離級別。tran ttt選擇*等待延遲 00 : 00 : 30,并選擇*提交tran ttt 2。在連接b中執(zhí)行以下語句,并在第一秒等待30秒。更新客戶設置標題= d 其中這次id = 17,連接將被鎖定,直到連接結束才能執(zhí)行。連接中的兩個讀數(shù)據(jù)是相同的,不受b連接的干擾。注意,對于提交讀取和未提交讀取,b連接不會被鎖定。在連接完成之前,兩個查詢語句是不同的,即第二個查詢的標題是d .閱讀:序列化serialization 1。在連接中執(zhí)行。設置交易開始的隔離級別,然后更新客戶設置title = 等待延遲 00 : 00 : 20通過t 2提交。在連接b中執(zhí)行,在a中執(zhí)行后20秒內(nèi)執(zhí)行..啟動tran tt插入客戶選擇2,2提交tran tt在提交關聯(lián)交易之前,您可以 t將b連接插入到表中的數(shù)據(jù)中,避免了讀取的錯覺。注意:錯覺是事務不獨立執(zhí)行時的常見現(xiàn)象,比如第一個事務修改了表中的數(shù)據(jù),包括表中的所有數(shù)據(jù)行。同時,第二個事務也修改了表中的數(shù)據(jù),就是在表中插入一行新數(shù)據(jù)。那么以后如果在表中出現(xiàn)了數(shù)據(jù)行不被用戶操作第一個事務改變的假象,共享鎖(shared lock)共享鎖(s lock)允許并發(fā)事務在一個封閉的并發(fā)控制(指并發(fā)控制的類型)中讀取(選擇)資源。當一個資源存在于一個共享鎖(s鎖)上時,其他事務不能修改該數(shù)據(jù),一個讀操作總共完成。共享鎖(s lock)會立即釋放資源,除非事務隔離級別設置為repeatable或更高,或者共享鎖在事務時間鎖提示(s lock)中被保留。更新鎖更新鎖(u鎖)可以防止常見的死鎖。在可重復讀取或序列化事務中,事務讀取數(shù)據(jù){獲取資源(頁或行)的共享鎖(鎖)},然后修改數(shù)據(jù)。此操作所需的鎖是x鎖。如果兩個事務獲得共享模式鎖的資源,然后試圖同時更新數(shù)據(jù),則一個事務試圖將其鎖定為獨占鎖(x鎖)。從共享模式鎖的轉(zhuǎn)換必須等待一段時間,因為一個事務獨占鎖與共享鎖的其他事務模式不兼容,出現(xiàn)鎖等待。第二個事務試圖獲得排他鎖(x鎖)更新。死鎖的發(fā)生是因為兩個事務被轉(zhuǎn)換為獨占鎖(x鎖),并且每個事務等待另一個事務釋放共享鎖。為了避免這種潛在的死鎖問題,使用了更新鎖(u鎖)。一次只有一個事務可以獲得資源的更新鎖(u lock)。如果一個事務修改了一個資源,更新鎖(u鎖)被轉(zhuǎn)換成一個排他鎖(x鎖)。排他鎖排他鎖(x鎖)防止并發(fā)事務訪問資源。當使用排他鎖(x鎖)時,任何其他事務都不能修改數(shù)據(jù)。只有當nolock提示出現(xiàn)或未讀取讀隔離級別時,才會執(zhí)行讀操作。數(shù)據(jù)修改語句(如insert、update、delete、modify和read操作)組合在一起,語句首先執(zhí)行read操作執(zhí)行所需的修改操作之前獲得的數(shù)據(jù)。因此,數(shù)據(jù)修改語句通常需要一個共享鎖和一個排他鎖。例如,update語句可以修改基于表連接的另一個表中的行。在這種情況下,除了更新行的排他鎖之外,update語句還將請求在連接表中讀取共享鎖的行。
了解更多事務隔離級別與數(shù)據(jù)庫中鎖的對應關系(數(shù)據(jù)庫中的事務隔離分為四個級別 其中允許不可重復讀取)相關內(nèi)容請關注本站點。