事務的隔離級別
資料庫事務的隔離級別有4種,由低到高分別為Read uncommitted 、Read committed 、Repeatable read 、Serializable ,而且,在事務的并發操作中可能會出現臟讀,不可重復讀,幻象讀,
| 隔離級別 | 臟讀 | 不可重復讀 | 幻象讀 |
| Read uncommitted | ? | ? | ? |
| Read committed | ? | ? | ? |
| Repeatable read | ? | ? | ? |
| Serializable | ? | ? | ? |
Read uncommitted( 未提交讀 )
一個事務可以讀取另一個未提交事務的資料,
事例:老板要給程式員發工資,程式員的工資是 3.6萬 /月,但是發工資時老板不小心按錯了數字,按成 3.9萬 /月,該錢已經打到程式員的戶口,但是事務還沒有提交,就在這時,程式員去查看自己這個月的工資,發現比往常多了 3千 元,以為漲工資了非常高興,但是老板及時發現了不對,馬上回滾差點就提交了的事務,將數字改成 3.6萬 再提交,
分析:實際程式員這個月的工資還是 3.6萬,但是程式員看到的是 3.9萬 ,他看到的是老板還沒提交事務時的資料,這就是臟讀,
Read committed( 提交讀 )
一個事務要等另一個事務提交后才能讀取資料,
事例:程式員拿著信用卡去享受生活( 卡里當然是只有 3.6萬 ),當他埋單時( 程式員事務開啟 ),收費系統事先檢測到他的卡里有 3.6萬,就在這個時候!!程式員的妻子要把錢全部轉出充當家用,并提交,當收費系統準備扣款時,再檢測卡里的金額,發現已經沒錢了( 第二次檢測金額當然要等待妻子轉出金額事務提交完 ),程式員就會很郁悶,明明卡里是有錢的…
分析:這就是讀提交,若有事務對資料進行更新( UPDATE )操作時,讀操作事務要等待這個更新操作事務提交后才能讀取資料,可以解決臟讀問題,但在這個事例中,出現了一個事務范圍內兩個相同的查詢卻回傳了不同資料,這就是不可重復讀,
Repeatable read( 可重復讀 )
重復讀,就是在開始讀取資料( 事務開啟 )時,不再允許修改操作
事例:程式員拿著信用卡去享受生活(卡里當然是只有3.6萬),當他埋單時( 事務開啟,不允許其他事務的 UPDATE 修改操作 ),收費系統事先檢測到他的卡里有 3.6萬,這個時候他的妻子不能轉出金額了,接下來收費系統就可以扣款了,
分析:重復讀可以解決不可重復讀問題,寫到這里,應該明白的一點就是,不可重復讀對應的是修改,即UPDATE操作,但是可能還會有幻讀問題,因為幻讀問題對應的是插入插 NSERT 操作,而不是 UPDATE 操作,
Serializable 序列化
Serializable 是最高的事務隔離級別,在該級別下,事務串行化順序執行,可以避免臟讀、不可重復讀與幻讀,但是這種事務隔離級別效率低下,比較耗資料庫性能,一般不使用,
鎖
鎖可以防止事務的并發問題,在多個事務訪問下能夠保證資料庫完整性和一致性,
共享( S )鎖
用于不更改或不更新資料的讀取操作,如 SELECT 陳述句,
理解:允許并發事務讀取( SELECT )的一個資源,資源上存在共享鎖時,任何事務不能修改資料,一旦已經讀取資料,便立即釋放資源上的共享鎖,
就相當于多個設備可以同時讀取資料庫資料,都可以對其加共享鎖;但若某一設備想修改資料,則需要等所有設備查詢完成后,在都釋放共享鎖之后,加自己的更新鎖
舉例:
當某人查詢某張表的一條記錄時,就會在該記錄上放置共享鎖,在而其他人也要查詢這張表的此記錄時,因為共享鎖彼此不互斥,所以也可以再次放置共享鎖,也就是說SQL SERVER 允許不同連接同時讀取相同的資料,如果此時有人要更新此記錄,因為獨占鎖與共享鎖互斥,所以無法放置獨占鎖,要等到所有讀取此記錄的人都讀取完畢,釋放了共享鎖,更新資料的人才能對該記錄設定獨占鎖,并進一步更新資料,
一般情況下,在默認的事務隔離級別下,當資料讀取完畢,SQL SERVER 就會釋放共享鎖,除非有特別的設定,
更新( U )鎖
在修改操作的初始化階段用來鎖定要被修改的資源,避免使用共享鎖造成的死機現象,
一次只有一個事務可以獲取資源的更新鎖,如果事務修改資源,則更新鎖( U )轉換為排他鎖( X )
舉例:
當查詢一條記錄后,要將此內容更新( Update 陳述句加上 Where 條件 ),一定會先查找記錄,在查找的程序中就會對相關的記錄放置共享鎖,等找到相應的記錄之后,SQL SERVER 會先對記錄放置更新鎖,以避免發生死鎖,因為共享鎖與更新鎖并不互斥,如果兩個人同時對同一條記錄放置共享鎖,先進行更新的人,可以在別人也對同一條記錄放置了共享鎖時,繼續放置更新鎖,但因為更新鎖互斥,所以當另一個人想再放置更新鎖時,將無法設定,而進入停止等待狀態,
排他( X )鎖
用于資料修改操作,例如 INSERT、UPDATE 或 DELETE, 確保不會同時對同一資源進行多重更新,
舉例:
UPDATE 陳述句可能根據與一個表的聯接修改另一個表中的行, 在此情況下,除了請求更新行上的獨占鎖之外,UPDATE 陳述句還將請求在聯接表中讀取的行上的共享鎖,
意向鎖
用于建立鎖的層次結構, 意向鎖包含三種型別:意向共享( IS )、意向排他( IX )和意向排他共享( SIX ),
意向共享( IS ):通過在資源上放置 IS 鎖,表明事務的意向時讀取層次結構中的部分( 而不是全部 )底層資源,
意向排他( IX ):通過在資源上放置 IX 鎖,表明事務的意向時修改層次結構中的部分( 而不是全部 )底層資源,
意向排他共享( SIX ):IS鎖 和 IX鎖 的綜合運用,每一資源在一個時間段內只能有一個 SIX鎖,
舉例:
在表的資料頁或資料行上請求共享鎖( S鎖 )之前,在表級( 或頁級 )請求共享意向鎖,以防止另一個事務隨后在包含那一頁的表上嘗試放置獨占鎖( X鎖 ),
架構鎖
在執行依賴于表架構的操作時使用, 架構鎖包含兩種型別:架構修改 ( Sch-M ) 和架構穩定性 ( Sch-S ),
大容量更新( BU )鎖
在向表進行大容量資料復制且指定了 TABLOCK 提示時使用,
我只是一個快樂的搬運工,只是想自己匯總資料,方便查看
真正的博文請點擊各標題就可以跳轉過去;若侵犯到您的利益,請聯系我,我立即洗掉!
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/299905.html
標籤:其他
下一篇:mysql中文亂碼記錄
