1、行級鎖(tx鎖,也叫事務鎖)在操作DML(create,insert,update)語句時,oracle會自動加上行級鎖,在select * from table for update 【of column】【nowait|wait 3】時,oracle也會自動加鎖
建議(1)一般在for update 時加nowait,這樣就不用等待其他事務執行了,一判斷有事務,立馬拋出錯誤。
建議(2)一般的of column都是在多表操作的時候,能鎖定其中一個表的某些列,如果還是同一張表的話,並不能鎖定某些列
2、表級鎖(tm鎖)
表級鎖包含了行級鎖,(1),(2)也是通過行級鎖來達到表級鎖的,他倆沒有嚴格的分類,表級鎖是oracle直接掃整個表來判斷事務了,而不用去掃描表里的每一行去判斷事務了,這個在一些時候是非常有用的
表級鎖分了很多類型(mode):
(1)行共享 (ROW SHARE) – 禁止排他鎖定表
(2)行排他(ROW EXCLUSIVE) – 禁止使用排他鎖和共享鎖
(3)共享鎖(SHARE)
(4)鎖定表,僅允許其他用戶查詢表中的行
禁止其他用戶插入、更新和刪除行
多個用戶可以同時在同一個表上應用此鎖
(5)共享行排他(SHARE ROW EXCLUSIVE) – 比共享鎖更多的限制,禁止使用共享鎖及更高的鎖
(6)排他(EXCLUSIVE) – 限制最強的表鎖,僅允許其他用戶查詢該表的行。禁止修改和鎖定表
一般的語法:
lock table STUDENT in exclusive mode;(表級鎖排他)
但是在java程序中怎樣去調用這樣的語句,暫時沒弄出來,這些語句在dba的使用的比較多
項目實戰:
一方面,當Oracle執行SELECT…FOR UPDATE、INSERT、UPDATE、DELETE等DML語句時,
系統自動在所要操作的表上申請表級RS鎖(SELECT…FOR UPDATE)或RX鎖(INSERT、UPDATE、DELETE),當表級鎖獲得后,系統再自動申請TX鎖,並將實際鎖定的數據行的鎖標志位置位(指向該TX鎖);另一方面,程序或操作人員也可以通過LOCK TABLE語句來指定獲得某種類型的TM鎖。下表是筆者總結了Oracle中各SQL語句產生TM鎖的情況:
表六:Oracle數據庫TM鎖小結
我們可以看到,通常的DML操作(SELECT…FOR UPDATE、INSERT、UPDATE、DELETE),在表級獲得的只是意向鎖(RS或RX),其真正的封鎖粒度還是在行級;另外,Oracle數據庫的一個顯著特點是,在缺省情況下,單純地讀數據(SELECT)並不加鎖,Oracle通過回滾段(Rollback segment)來保證用戶不讀"臟"數據。這些都提高了系統的並發程度。
由於意向鎖及數據行上鎖標志位的引入,減小了Oracle維護行級鎖的開銷,這些技術的應用使Oracle能夠高效地處理高度並發的事務請求。
表六:Oracle數據庫TM鎖小結
我們可以看到,通常的DML操作(SELECT…FOR UPDATE、INSERT、UPDATE、DELETE),在表級獲得的只是意向鎖(RS或RX),其真正的封鎖粒度還是在行級;另外,Oracle數據庫的一個顯著特點是,在缺省情況下,單純地讀數據(SELECT)並不加鎖,Oracle通過回滾段(Rollback segment)來保證用戶不讀"臟"數據。這些都提高了系統的並發程度。
由於意向鎖及數據行上鎖標志位的引入,減小了Oracle維護行級鎖的開銷,這些技術的應用使Oracle能夠高效地處理高度並發的事務請求。
