Oracle儲存過程中使用行鎖的示例

2021-08-30 06:13:15 字數 1377 閱讀 4236

以前對oracle鎖只概念上的一點點了解,沒有認真考慮或使用過。直到在開發過程中遇到了由於沒有使用鎖而導致的併發問題,才對此重視起來。

舉個例子來說明我遇到的問題。

乙個入庫單錶(t_rkd),每一條記錄對應著一條入庫資訊,還有個一對多的關聯表來記錄此入庫單的明細資訊。我使用t_rkd表中乙個欄位來標識這條記錄是否入過庫,若未入過,對明細進行入庫處理。入過之後,修改入庫標誌。以上操作通過乙個儲存過程來完成。

以上操作,當兩個人同時處理一條入庫記錄的時候,兩個人同時取入庫標誌,看到的都是未入過庫,然後,你可以想到了,入庫操作就被做了兩次。

併發操作的時候,如果考慮不周,會出現很多難以發現的錯誤。這時就可以用到鎖了。我使用乙個行鎖來解決這個問題,通過鎖,使該儲存過程不能同時由多個執行緒呼叫,處理同一條記錄。

儲存過程的大致**如下:

create or replace procedure p1(pdm in varchar2) is

v_flagrk char(1);

begin

select flagrk into v_flagrk from t_rkd where dm=pdm for update wait 5;

--開始事務

--執行業務邏輯

--修改入庫標誌

--提交事務

--若出異常,回滾

end p1;

/

在儲存過程開始執行的時候,先申請獨佔鎖,這樣就可以避免由於併發導致的業務邏輯被多次執行的問題。

部落格:

網路硬碟:

[/color]

以上為在儲存過程中鎖住一條記錄,比較容易想到,其實還有一種情況,是要同時鎖住多條記錄,如庫存資料。如何來解決呢,我翻了幾遍pl/sql程式設計,加上一點靈感,才想到解決方案,很簡單,貼出來希望對朋友們有幫助,使用下面的**就可以了:

create or replace procedure p2(pdm in varchar2) is

type kcdm_table_type is table of t_kc.dm%type index by binary_integer;

kcdm_table kcdm_table_type;

begin

select dm bulk collect into kcdm_table from t_kc

where ...

for update wait 7;

--開始事務

--執行業務邏輯

--提交事務

--若出異常,回滾

end p2;

/

就是使用bulk collect,執行乙個批量操作。

oracle 儲存過程 行鎖

問題 1.要求通過儲存過程實現程式執行的併發控制。2.儲存過程乙個輸入引數乙個輸出引數,輸入要執行的程式名稱,判斷該程式是否在執行輸出引數返回程式狀態 3.解決問題 當兩個使用者同時訪問同一程式時,都檢索到該程式未執行,同時執行,併發失效。create or replace procedure pr...

儲存過程中使用隔離級別

set transaction isolation level 控制由連線發出的所有 microsoft sql server select 語句的預設事務鎖定行為。語法 set transaction isolation level 引數 read committed 指定在讀取資料時控制共享鎖以...

儲存過程中使用事務

create procedure updatewanjun username nvarchar 500 userpassword nvarchar 500 returnval int output as set xact abort on begin transaction t update adm...