數據庫事務和鎖定之間的確切關係是什麼?
這是本著增加知識的精神提出的一個謙虛的問題;請在你的回應溫柔。
作為一名長期的應用程序開發人員,我在某種程度上知道事務是什麼(我一直都在使用它們)。暫時撇開事務隔離級別不談,在較高級別上,事務允許一個工作塊完全完成或根本不完成,並允許與其他數據庫修改活動有一定程度的隔離。
我也知道(在各種數據庫中)鎖是什麼,或者至少知道一個鎖的行為方式(如果我以某種方式明確地鎖定一個表,那麼沒有其他程序或執行緒可以更新關於該表的任何內容)。
我最不清楚的是:在各種數據庫中,當我顯式鎖定一行或一個表時,我是否使用了與數據庫事務設施在幕後使用的完全相同的結構來使事務正常工作?
也就是說,我突然想到,為了使事務成為原子和隔離的,它必須進行一些鎖定。這種事務啟動、事務隱藏的鎖定是否與各種數據庫允許我通過諸如
SELECT FOR UPDATE
顯式LOCK
命令之類的構造訪問的鎖定相同?還是這兩個概念完全不同?再次,我為這個問題的幼稚道歉;我很高興被指出更多的基礎資源。
當我顯式鎖定一行或一個表時,我是否使用了與數據庫事務設施在幕後使用的完全相同的結構來使事務正常工作?
是的。如果這不是真的,那麼您自己的“鎖定”將僅適用於其他類似的“鎖定”,並且不會與引擎自己的鎖定互動。因此,您將鎖定表中的一行,這樣它就不能被另一個應用程序以相同的方式鎖定,但是引擎本身會忽略您的鎖定。很少需要這些語義。大多數情況下,鎖定一行的應用程序意味著“鎖定它以防止任何訪問/修改方式”。旁注,嚴格的特定於應用程序的鎖定機制確實存在,因為它們很有用。例如 SQL Server 有應用程序鎖。
我突然想到,為了使事務是原子的和隔離的,它必須做一些鎖定。
鎖定是實現此目的的一種手段。主要的替代方案是版本控制。現在大多數數據庫都支持兩者(這也意味著如果您在應用程序中“鎖定”一行,但另一個事務使用版本控制來讀取該行,它將讀取它,因為您的鎖定不會阻止版本化讀取)。
您正在圍繞一個在數據庫實現世界中稱為“兩階段鎖定協議”的概念進行盤旋。連結的維基百科文章是一個很好的開始。如果您想閱讀有關此主題的更詳細說明,我建議您前往圖書館並請求借閱Transaction Processing: Concepts and Techniques。幾乎每個數據庫的核心都是該書的實現。