2010-03-26 27 views
1

我想同步對特定插入的訪問。因此,如果多個應用程序執行此「一個」插入,插入應該一次發生一次。同步背後的原因是應該只有這個實體的一個實例。如果多個應用程序嘗試插入相同的實體,則只有一個應該成功,而其他應該失敗。 考慮的一個選項是創建一個複合唯一鍵,它將唯一標識實體並依賴於唯一約束。由於某些原因,dba部門拒絕了這個想法。我想到的其他選項是爲插入創建一個存儲過程,如果存儲的過程可以獲得全局鎖,那麼多個應用程序調用相同的存儲過程,但是在他們單獨的數據庫會話中,預計存儲過程可以獲得全局鎖定並因此序列化插入。 我的問題是有可能在oracle版本10/11中存儲proc來獲得這樣的鎖,任何指向文檔的指針都會有幫助。跨進程的Oracle全局鎖定

+0

考慮到這是唯一約束的主要原因之一,我無法想象爲什麼DBA組會說「不要使用唯一約束來序列化對一組列的訪問」。我可能想到的唯一原因是,如果會話A插入阻止會話B,C和D的行,則會話B-D將掛起等待會話A提交或回滾阻塞語句。或者,斷言你需要唯一的索引來保證數據的一致性,並且他們不會站在腳下。 – 2010-03-29 16:58:01

回答

1

如果你希望插入的實體是唯一的,那麼在Oracle中你不需要串行化任何東西 - 一個唯一的約束是完美的設計和適用於這個目的。 Oracle處理所有需要的鎖定以確保只有一個實體被插入。

我想不出爲什麼dba部門拒絕了唯一約束的想法,這是非常基本的 - 也許他們拒絕了您提出的解決方案的其他方面。你可以(a)在整個表上鎖定一個表,這個表可以將所有的DML序列化;如果你想要序列化訪問(因爲某些原因,我想不出爲什麼你會這麼做),你可以(a)或者(b)使用DBMS_LOCK獲得一個用戶命名的鎖 - 這隻會將您獲取鎖的特定進程序列化。這兩種選擇都有優點和缺點。