資源描述:
《高可用性、負載均衡的mysql集群解決方案》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、數(shù)據(jù)庫弱一致性四個隔離級別SQL-92標準中定義了四個隔離級別,這四個隔離級別在以前版本的SQLServer中即受到支持:READUNCOMMITTEDREADUNCOMMITTED是限制性最弱的隔離級別,因為該級別忽略其他事務(wù)放置的鎖。使用READUNCOMMITTED級別執(zhí)行的事務(wù),可以讀取尚未由其他事務(wù)提交的修改后的數(shù)據(jù)值,這些行為稱為“臟”讀。這是因為在ReadUncommitted級別下,讀取數(shù)據(jù)不需要加S鎖,這樣就不會跟被修改的數(shù)據(jù)上的X鎖沖突。比如,事務(wù)1修改一行,事務(wù)2在事務(wù)1提交之前讀取了
2、這一行。如果事務(wù)1回滾,事務(wù)2就讀取了一行沒有提交的數(shù)據(jù),這樣的數(shù)據(jù)我們認為是不存在的。READCOMMITTEDREADCOMMITTED(Nonrepeatablereads)是SQLServer默認的隔離級別。該級別通過指定語句不能讀取其他事務(wù)已修改但是尚未提交的數(shù)據(jù)值,禁止執(zhí)行臟讀。在當前事務(wù)中的各個語句執(zhí)行之間,其他事務(wù)仍可以修改、插入或刪除數(shù)據(jù),從而產(chǎn)生無法重復(fù)的讀操作,或“影子”數(shù)據(jù)。比如,事務(wù)1讀取了一行,事務(wù)2修改或者刪除這一行并且提交。如果事務(wù)1想再一次讀取這一行,它將獲得修改后的數(shù)據(jù)或
3、者發(fā)現(xiàn)這一樣已經(jīng)被刪除,因此事務(wù)的第二次讀取結(jié)果與第一次讀取結(jié)果不同,因此也叫不可重復(fù)讀。實驗1query1:事務(wù)1--step1:創(chuàng)建實驗數(shù)據(jù)select*intoEmployeefromAdventureWorks.HumanResources.EmployeealtertableEmployeeaddconstraintpk_Employee_EmployeeIDprimarykey(EmployeeID)--step2:設(shè)置隔離級別,這是數(shù)據(jù)庫的默認隔離界別SETTRANSACTIONISOLATI
4、ONLEVELREADCOMMITTED--step3:開啟第一個事務(wù)BEGINTRANtran1--step4:執(zhí)行select操作,查看VacationHours,對查找的記錄加S鎖,在語句執(zhí)行完以后自動釋放S鎖SELECTEmployeeID,VacationHoursFROMEmployeeWHEREEmployeeID=4;--step5:查看當前加鎖情況,沒有發(fā)現(xiàn)在Employee表上面有鎖,這是因為當前的隔離界別是READCOMMITTED--在執(zhí)行完step2以后馬上釋放了S鎖.SELECT
5、request_session_id,resource_type,resource_associated_entity_id,request_status,request_mode,resource_descriptionFROMsys.dm_tran_locks查看鎖的情況如下圖所示,我們發(fā)現(xiàn)在只有在數(shù)據(jù)庫級別的S鎖,而沒有在表級別或者更低級別的鎖,這是因為在ReadCommitted級別下,S鎖在語句執(zhí)行完以后就被釋放。query2:事務(wù)2--step6:開啟第二個事務(wù)BEGINTRANtran2;--
6、step7:修改VacationHours,需要獲得排它鎖X,在VacationHours上沒有有S鎖UPDATEEmployeeSETVacationHours=VacationHours-8WHEREEmployeeID=4;--step8:查看當前加鎖情況SELECTrequest_session_id,resource_type,resource_associated_entity_id,request_status,request_mode,resource_descriptionFROMsys.
7、dm_tran_locks在開啟另外一個update事務(wù)以后,我們再去查看當前的鎖狀況,如下圖所示,我們發(fā)現(xiàn)在表(Object)級別上加了IX鎖,在這張表所在的Page上也加了IX鎖,因為表加了聚集索引,所以在葉子結(jié)點上加了X鎖,這個鎖的類型是KEY。然后我們回到事務(wù)1當中再次執(zhí)行查詢語句,我們會發(fā)現(xiàn)查詢被阻塞,我們新建一個查詢query3來查看這個時候的鎖狀況,其查詢結(jié)果如下,我們可以發(fā)現(xiàn)查詢操作需要在KEY級別上申請S鎖,在Page和表(Object)上面申請IS鎖,但是因為Key上面原先有了X鎖,與當
8、前讀操作申請的S鎖沖突,所以這一步處于WAIT狀態(tài)。如果此時提交事務(wù)2的update操作,那么事務(wù)1的select操作不再被阻塞,得到查詢結(jié)果,但是我們發(fā)現(xiàn)此時得到的查詢結(jié)果與第一次得到的查詢結(jié)果不同,這也是為什么將readcommitted稱為不可重復(fù)讀,因為同一個事物內(nèi)的兩次相同的查詢操作的結(jié)果可能不同。REPEATABLEREADREPEATABLEREAD是比READCOMMITTED限制性更強的隔離級別