我想同步對特定插入的訪問。因此,如果多個應用程序執行此「一個」插入,插入應該一次發生一次。同步背後的原因是應該只有這個實體的一個實例。如果多個應用程序嘗試插入相同的實體,則只有一個應該成功,而其他應該失敗。 考慮的一個選項是創建一個複合唯一鍵,它將唯一標識實體並依賴於唯一約束。由於某些原因,dba部門拒絕了這個想法。我想到的其他選項是爲插入創建一個存儲過程,如果存儲的過程可以獲得全局鎖,那麼多個應用程序調用相同的存儲過程,但是在他們單獨的數據庫會話中,預計存儲過程可以獲得全局鎖定並因此序列化插入。 我的問題是有可能在oracle版本10/11中存儲proc來獲得這樣的鎖,任何指向文檔的指針都會有幫助。跨進程的Oracle全局鎖定
1
A
回答
1
如果你希望插入的實體是唯一的,那麼在Oracle中你不需要串行化任何東西 - 一個唯一的約束是完美的設計和適用於這個目的。 Oracle處理所有需要的鎖定以確保只有一個實體被插入。
我想不出爲什麼dba部門拒絕了唯一約束的想法,這是非常基本的 - 也許他們拒絕了您提出的解決方案的其他方面。你可以(a)在整個表上鎖定一個表,這個表可以將所有的DML序列化;如果你想要序列化訪問(因爲某些原因,我想不出爲什麼你會這麼做),你可以(a)或者(b)使用DBMS_LOCK獲得一個用戶命名的鎖 - 這隻會將您獲取鎖的特定進程序列化。這兩種選擇都有優點和缺點。
相關問題
- 1. 在Linux中的跨進程鎖定
- 2. 在java中實現跨進程鎖定
- 3. 鎖定全局npm包
- 4. 全局變量進行的跨在Python模塊和線程
- 5. 共享庫/ dll中的全局變量,跨進程共享
- 6. Oracle索引 - 全表掃描/鎖定
- 7. 跨進程使用互斥鎖
- 8. 跨進程/機器的SharePoint列表/項目鎖定方法?
- 9. 使用File#flock作爲ruby全局鎖(進程互斥量)
- 10. (全局)鎖定接口方向?
- 11. 全局變量跨線程不更新
- 12. 確定進程中的鎖
- 13. 跨羣集共享Java同步塊,或使用全局鎖?
- 14. oracle中的全局變量
- 15. Pygame和線程:訪問全局變量時鎖定?
- 16. 在Python Web應用程序中執行全局鎖定?
- 17. 表oracle已鎖定
- 18. oracle表未鎖定
- 19. 全球平臺卡鎖與全局鎖特權的區別
- 20. 用Java鎖定進程
- 21. 沒有鎖定父進程
- 22. Log4Net - 文件進程鎖定
- 23. oracle窗體 - 鎖定過程屬性
- 24. Oracle sql - 全局變量
- 25. oracle全局臨時表
- 26. 線程安全用更少的鎖定
- 27. 跨服務鎖定文件
- 28. Linux互斥鎖必須是全局的?
- 29. 跨網頁的Django全局變量?
- 30. 跨MVC控制器的全局數據
考慮到這是唯一約束的主要原因之一,我無法想象爲什麼DBA組會說「不要使用唯一約束來序列化對一組列的訪問」。我可能想到的唯一原因是,如果會話A插入阻止會話B,C和D的行,則會話B-D將掛起等待會話A提交或回滾阻塞語句。或者,斷言你需要唯一的索引來保證數據的一致性,並且他們不會站在腳下。 – 2010-03-29 16:58:01