1. 程式人生 > >淺談Oracle鎖機制表鎖行鎖樂觀鎖悲觀鎖

淺談Oracle鎖機制表鎖行鎖樂觀鎖悲觀鎖

  Oracle的鎖機制主要分為行鎖和表鎖,行鎖即鎖定表中的某行資料,表鎖鎖定表中所有資料。鎖定的資料不能插入,更新,刪除,只能查詢,語法 for update。鎖的週期為一次資料提交,一次資料提交中可能會有多條SQL語句。
  在大併發中為了保證某些資料的唯一性,常用到鎖的機制,下文會有介紹如何在大併發下保證訂單流水號的唯一性。
表鎖:
執行緒1:select * from user for update;
執行緒2:update user set name=’123’ 堵塞
update user set name=’123’ where id = 1 堵塞
user表被鎖定,其他程序無法修改表中資料,只能查詢。

行鎖:
執行緒1:select * from user where id = 1 for update;
執行緒2:update user set name=’123’ 堵塞
update user set name=’123’ where id = 1 堵塞
update user set name=’123’ where id = 2 正常
user表中id=1資料被鎖定,其他程序無法修改user該條資料。

悲觀鎖即為獨佔鎖,A執行緒操作a表a1資料,其他執行緒需等待A的事務提交後才能操作a1資料。
樂觀鎖通過控制版本號實現資料是否提交,A執行緒操作a表a1資料(讀取當前表版本號1),事務提交改為版本號1+1=2。B執行緒在A執行緒未提交亦執行相同操作,版本號1+1=2<2,阻止該操作update a set a1=new and version.a=version.a+1 where version = version.a,允許版本號不連續覆蓋的話version >= version.a。
表鎖行鎖針對的是資料庫
樂觀鎖,悲觀鎖是一種概念