1、通過select for update或select for update wait或select for update nowait給數據集加鎖
具體實現參考select for update和select for update wait和select for update nowait的區別
2、Skip Locked(跳過加鎖行獲得可以加鎖的結果集)
Skip locked是oracle 11g引入的。
通過skip locked可以使select for update語句可以查詢出(排除已經被其他會話加鎖了的數據行)剩下的數據集,並給剩下的數據集,進行加鎖操作。
a、測試一、
代碼如下:新建一個SQL窗口1(相當於新建一個會話),執行
update test8 set price=6 where ID=1
但是不執行commit操作,此時,當前數據已經被加鎖了。
然后,在新建一個SQL窗口2(相當於新建一個會話),執行
select * from test8 for update skip locked
根據結果集,我們發現ID=1的數據行被排除了
b、測試二
新建SQL窗口1(相當於新建一個會話)代碼如下:執行如下語句
select * from test8 for update
此時,不進行commit操作,表中所有的數據行被加鎖。根據測試一的結果得出推論:如果使用skip locked的話將查詢不出任何結果
新建SQL窗口2(相當於新建一個會話)代碼如下:執行如下語句
select * from test8 for update skip locked
沒有查出任何結果集,ok,推論正確!