oracle 資料庫會為事務自動鎖定資源,以防止其他事務進行某些需要獨佔訪問同一資源的操作。資料庫在不同的限制級別自動獲取不同型別的鎖,這依賴於不同的資源和正在執行的操作。
注意:
執行簡單讀取時,資料庫絕不會鎖定行。
oracle 資料庫鎖分為以下幾類。
dml鎖
dml 語句自動獲取下列型別的鎖:
行鎖 (tx)
表鎖 (tm)
在下面幾節,在每種型別的鎖或鎖模式後的括號中,首字母縮寫詞是用於在oracle 企業管理器 (企業管理器)的鎖監視器中的縮寫。企業管理器中可能將任何的表鎖顯示為tm,而不顯示表鎖的模式(如rs或srx)。
行鎖(tx)
行鎖,也稱為 tx鎖,是乙個表中單個行上的鎖。乙個事務在被insert、 update、delete、merge、或 select … for update等語句所修改的每一行上獲取乙個行鎖。行鎖一直存在直到事務提交或回滾。
行鎖主要作為一種排隊的機制,以防止兩個事務修改相同的行。資料庫始終以獨佔模式鎖定修改的行,以便其他事務不能修改該行,直到持有鎖的事務提交或回滾。行鎖定提供了近乎最細粒度的鎖定,並因此提供了近乎最佳的併發性和吞吐量。
注意:
如果乙個事務因為資料庫例項失效而終止,會先進行塊級恢復以使行可用,之後進行整個事務恢復。
如果乙個事務在某行上獲取了乙個鎖,則該事務也將在包含該行的表上獲取乙個鎖。表鎖可防止衝突性的ddl 操作在當前事務中會覆蓋資料更改。圖 9-2 演示了在乙個表中第三行上的更新。oracle 資料庫將自動在更新行上置乙個獨佔鎖,且在表上置乙個次獨佔鎖。
行鎖和併發
表 9-6 說明了oracle資料庫如何在併發事務中使用行鎖。3個會話同時查詢相同的行。會話2 和會話 3 對不同的行進行未提交更新,而會話3沒有做任何更新。每個會話可以看到自己的未提交更新,但看不到其他會話中所做的任何未提交更新。
行鎖儲存
與某些資料庫使用鎖管理器在記憶體中維護乙個鎖列表不同,oracle資料庫將鎖資訊儲存在包含鎖定行的資料塊中。
資料庫使用排隊機制來獲取行鎖。如果事務需要為某個未鎖定的行獲取乙個鎖,則事務將在資料塊上置乙個鎖。被此事務修改的每個行指向儲存在塊頭中的事務 id 的乙個副本。
當事務結束時,事務 id 仍然保留在塊頭中。如果乙個不同的事務想要修改某行,則它使用該事務 id 來確定鎖是否處於活動狀態。如果鎖是活動的,則會話要求該鎖被釋放時得到通知。否則,事務獲取該鎖。
mysql spring鎖 MySQL鎖概述
鎖是計算機協調多個程序或執行緒併發訪問某一資源的機制。在資料庫中,除傳統的計算資源 如cpu ram i o等 的爭用以外,資料也是一種供許多使用者共享的資源。如何保證資料併發訪問的一致性 有效性是所有資料庫必須解決的乙個問題,鎖衝突也是影響資料庫併發訪問效能的乙個重要因素。從這個角度來說,鎖對資料...
各種鎖概述
重量級鎖 程序或者執行緒想訪問某個資源,如果沒有執行緒訪問,則占有這個資源,且加上鎖,等用完之後再釋放掉鎖。如果這個資源被其他執行緒占有,就會堵塞,直到其他執行緒讓出該資源並喚醒該執行緒。自旋鎖 把執行緒從執行態轉為阻塞態,會儲存上下文,涉及到核心態到使用者態的轉換,非常浪費時間,被其他執行緒喚醒,...
理解mysql鎖(1)鎖的概述
相對其他資料庫而言,mysql的鎖機制比較簡單 其最顯著的特點是不同的儲存引擎支援不同的鎖機制 但總的來說,mysql各種儲存引擎使用了三種型別的鎖定機制 行級鎖定 頁級鎖定和表級鎖定 其中,myisam主要使用表級鎖定,而使用行級鎖定的主要是innodb。表級鎖 開銷小,加鎖快 不會出現死鎖 鎖定...