五分鐘理解資料庫事務引發的安全性問題

2021-08-28 22:17:15 字數 3100 閱讀 5076

最近面試發現面試官都很容易問關於這方面的問題,所以就稍稍總結了下,希望對正在找工作的小夥伴們有幫助,如何快速的理解並且記住事務引發的安全性問題,從而在面試中取得好的成績。

本文主要分三個模組來講解。需要重點理解共享鎖/排它鎖,鎖的三要素,事務級別和鎖的關係

第一部分:鎖的介紹

1.什麼是樂觀鎖?

通俗的理解,太樂觀了,總是認為我們對資料操作時,不會產生衝突問題。也就是說在運算元據時,並不進行任何其他的特殊處理(也就是不加鎖),而在進行更新後,再去判斷是否有衝突了。一般來說資料庫不實現樂觀鎖,需要我們自己去實現。

樂觀鎖中常見的實現機制:先給資料表加乙個版本(version)字段,操作一次,將那條記錄的版本號加1。

2.什麼是悲觀鎖?

通俗的理解,太悲觀了,總是認為我們對資料操作時,會產生衝突問題。也就是說每次操作時,都要通過獲取鎖才能進行對相同資料的操作。資料庫本身實現了悲觀鎖。

有哪些悲觀鎖?

2.1共享鎖:又稱讀鎖,是讀取操作建立的鎖。其他事務可以併發讀取資料,但是不能對資料進行修改,直到釋放鎖。

共享鎖sql實現機制:select ... lock in share mode;

2.2 排它鎖:又稱寫鎖,如果事務t

對資料d

加上排他鎖後,則其他事務不能再對

d加任任何型別的鎖。獲准排他鎖的事務既 能讀資料,又能寫資料。

排他鎖sql實現機制:select ... for update;

2.3行鎖:對資料庫中的「讀寫操作的行」加鎖

2.4表鎖:對資料庫中的「讀取操作的表」加鎖

第二部分:安全性問題

1.髒讀:事務a正在訪問資料,並且對資料進行了修改,而這種修改還沒有提交到資料庫中。這時,事務b也訪問這個資料,                  然後使用了這個資料。

2.不可重複讀:在乙個事務中,多次讀取資料時,不能讀取到相同的資料內容。事務a讀取資料***之後未提交事務,此時                   事務b對資料***進行了修改,並且b提交了事務,持久化到資料庫,此時事務a在次讀取***資料,發現兩次讀取內                   容不一致。

幻讀:與不可重複讀的差異:不可重複讀是事務a讀取到了事務b的update行為,虛讀是事務a讀取到了事務b的insert行為。

第三部分:資料庫事務的級別

資料庫的事務級別我們可以理解為按照鎖來劃分的。主要有3個鎖的要素:鎖的型別、鎖的釋放、鎖的範圍。

1.鎖的型別:共享鎖、排他鎖。具體介紹看第一部分

2.鎖的釋放:2.1在運算元據上釋放鎖。對資料的讀寫操作完成後釋放鎖,此時如果運算元據的這個事務尚未結束,其他事務                             是可以繼續運算元據的。

2.2在運算元據的事務上釋放鎖。對資料的讀寫操作完成後並未釋放鎖,此時要等運算元據的這個事務結束後,                             其他事務才可以操作這個資料。

3.鎖的範圍:3.1對操作的資料上鎖。操作哪一行資料,就對哪一行資料上鎖。

3.2對操作的資料的表上鎖。操作那個表的資料,就對那個表上鎖。

一級事務:未提交讀(read uncommitted) 

原理:鎖的型別:讀取共享鎖

鎖的釋放:讀取資料結束,釋放鎖

鎖的範圍:對讀取的資料上鎖

引發的安全性:虛讀,不可重複讀,幻讀

表現:讀取資料未結束時,不釋放鎖,誰都可以讀,但是不能寫;

讀取資料結束,釋放鎖,但事務尚未結束的時候,其他事務可以隨意讀寫,因為此時鎖釋放了,事務卻沒有結                              束,所以什麼安全性問題都可能引發。

二級事務:已提交讀(read committed)

原理:鎖的型別:讀取共享鎖,修改排他鎖

鎖的釋放:讀取資料結束,釋放鎖

修改資料的事務結束,釋放鎖

鎖的範圍:對操作的資料上鎖

引發的安全性:不可重複讀,幻讀

表現:讀取操作和一級事務一致

修改資料的事務在沒有結束時,所有的事務都不可以修改,因為此時排它鎖還未釋放。因此解決了髒讀。

**事務:可重複讀(repeatable read)

原理:鎖的型別:讀取共享鎖,修改排他鎖

鎖的釋放:讀取資料的事務結束,釋放鎖

修改資料的事務結束,釋放鎖

鎖的範圍:對操作的資料上鎖

引發的安全性:幻讀

表現:讀取資料的事務在沒有結束時,所有的事務都不可以修改資料,因為此時讀取鎖還未釋放。

修改資料的事務在沒有結束時,所有的事務都不可以修改資料,因為此時排他鎖還未釋放。因此解決了不可重讀

四級事務:序列化(serializable)

原理:鎖的型別:讀取共享鎖,修改排他鎖

鎖的釋放:讀取資料的事務結束,釋放鎖

修改資料的事務結束,釋放鎖

鎖的範圍:對操作的表上鎖

引發的安全性:無(至少上述三種安全性)

表現:這個比較好理解,對錶上鎖了,而且都是讀寫的事務結束以後才釋放鎖,所以要寫的前提是,先拿到鎖。什麼時                        候能拿到鎖?讀寫資料的事務結束以後。所以能解決目前所知的所有安全性問題。但是這樣的話讀寫效率會很低。

如果你已經把我的這個看懂了,我相信以後你只需要看一眼這個表就能回想起來他們的關係了,如果在面試的時候遇到關於鎖的問題,事務的問題,或者髒讀,幻讀等問題。別管什麼,直接一條龍服務。其實我個人理解,把這三個部分串聯起來是最容易理解的。

徹底理解資料庫事務

事務 transaction 一般是指要做的或所做的事情。在計算機術語中是指訪問並可能更新資料庫中各種資料項的乙個程式執行單元 unit 在計算機術語中,事務通常就是指資料庫事務。乙個資料庫事務通常包含對資料庫進行讀或寫的乙個操作序列。它的存在包含有以下兩個目的 1 為資料庫操作提供了乙個從失敗中恢...

理解資料庫中的事務

什麼是事務?我們知道,資料庫是乙個面向多使用者的共享機制,因此資料庫管理系統應當具備併發控制和封鎖機制,保證資料庫系統的正常執行。但是當多個使用者訪問資料庫的時候,如果每乙個使用者程式乙個乙個的序列執行,則每一時刻只有乙個使用者執行對資料庫的操作,其他使用者必須等待,這樣的話會嚴重影響資料庫資源的使...

簡單例子理解資料庫事務

建立表 建立農行賬戶表bank if exists select from sysobjects where name bank drop table bank gocreate table bank customername char 10 顧客姓名 currentmoney money 當前餘額...