我使用配置爲使用自治事務的Oracle存儲過程插入一行。我想插入這條記錄,提交該事務,然後鎖定新插入的記錄,以便其他人不能修改它,除了我的當前會話(顯然,在另一個事務中,因爲插入它的事務是自治的)。如何插入記錄並同時鎖定該行?
我該如何確保沒有其他人在我有機會SELECT...FOR UPDATE
之前鎖定這條新記錄呢?
使用Oracle 10g。
我使用配置爲使用自治事務的Oracle存儲過程插入一行。我想插入這條記錄,提交該事務,然後鎖定新插入的記錄,以便其他人不能修改它,除了我的當前會話(顯然,在另一個事務中,因爲插入它的事務是自治的)。如何插入記錄並同時鎖定該行?
我該如何確保沒有其他人在我有機會SELECT...FOR UPDATE
之前鎖定這條新記錄呢?
使用Oracle 10g。
不,您永遠不能在事務之間保持鎖定。您應該問自己的問題是爲什麼您需要在insert
和select ... for update
之間提交提交。該行被insert
鎖定;如果您在提交之前完成了對該行的任何操作,那麼您不必擔心重新鎖定該行。
我的第一選擇是刪除COMMIT,直到數據準備好供其他會話使用。
或者,您可以設計您的應用程序,以確保新行僅被該事務鎖定。
在表格中添加一個標記,例如, VISIBLE
,默認'N'
。
當你插入一行時,插入它的默認值。
提交後,select
它for update
,並更新標誌'Y'
(所以,當你的代碼提交的第二次,它會更新標誌爲好)。
修改您的應用程序,以便其他會話將忽略行VISIBLE='N'
。
我認爲前兩個答案提出的真正問題是「爲什麼您需要使用自治事務插入行?」如上所述,您可以在原始流程中執行插入操作,然後使用記錄進行更新。在真正的交易完成時提交。 – 2010-07-20 13:02:09