आप जो अपवाद देख रहे हैं वह सख्त क्रमबद्धता का उपयोग करने का प्रत्यक्ष परिणाम है। यदि आपके पास एक से अधिक लेन-देन एक साथ सक्रिय हैं, तो प्रत्येक लेन-देन सेट करें Isolation LEVEL SERIALIZABLE के साथ शुरू होता है, जब उनमें से कोई भी अन्य करता है तो उसे ORA-08177 मिलेगा। इस तरह सख्त क्रमांकन लागू किया जाता है - डेटाबेस किसी भी सत्र में ORA-08177 फेंकता है, जो कि ISOLATION LEVEL SERIALIZABLE से शुरू होता है यदि कोई अन्य लेनदेन एक तालिका में होता है जिसे क्रमबद्ध सत्र की आवश्यकता होती है। इसलिए, मूल रूप से, यदि आपको वास्तव में सख्त क्रमांकन की आवश्यकता है, तो आपको ORA-08177 को समझदारी से संभालना होगा, जैसा कि निम्नलिखित में है:
DECLARE
bSerializable_trans_complete BOOLEAN := FALSE;
excpSerializable EXCEPTION;
PRAGMA EXCEPTION_INIT(excpSerializable, -08177);
BEGIN
<<SERIALIZABLE_LOOP>>
WHILE NOT bSerializable_trans_complete
LOOP
BEGIN
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
MERGE ...; -- or whatever
COMMIT;
bSerializable_trans_complete := TRUE; -- allow SERIALIZABLE_LOOP to exit
EXCEPTION
WHEN excpSerializable THEN
ROLLBACK;
CONTINUE SERIALIZABLE_LOOP;
END;
END LOOP; -- SERIALIZABLE_LOOP
END;
सीरियलाइजेशन जादू नहीं है, और यह "मुक्त" नहीं है (जहां "मुक्त" का अर्थ है "मुझे डेवलपर के रूप में इसे ठीक से काम करने के लिए कुछ भी करने की ज़रूरत नहीं है")। इसे ठीक से काम करने के लिए डेवलपर की ओर से अधिक योजना और काम करने की आवश्यकता है, कम नहीं। साझा करें और आनंद लें।