मैं मूल कारण (खंड, ब्लॉक, ताले के इंजन यांत्रिकी के मैकेनिक्स) को जानना चाहता हूं क्यों थोक डालने (प्रत्यक्ष पथ के साथ) पूरे टेबल को ताला लगा देता है, इसलिए यदि मैं सम्मिलित करता हूं एक विभाजन में, मैं किसी अन्य विभाजन को छोटा नहीं कर सकता जो सम्मिलित (स्पष्ट रूप से) प्रभावित नहीं होता है।विभाजित तालिका और तालिका स्तर लॉक में थोक डालने
एक पारंपरिक डालने (संलग्न संकेत के बिना) परमिट एक उदाहरण नीचे कुछ nonaffected विभाजन काटना। (सूचना है कि मैं के बारे में गैर प्रतिबद्ध लेनदेन बोलते हैं।)
यह ilustrate करने के लिए।
CREATE TABLE FG_TEST
(COL NUMBER)
PARTITION BY RANGE (COL)
(PARTITION "P1" VALUES LESS THAN (1000),
PARTITION "P2" VALUES LESS THAN (2000));
Insert into table fg_test values (1);
insert into table fg_test values (1000);
commit;
सत्र 1::
आज्ञा देना एक मेज हो
insert into table fg_test select * from fg_test where col >=1000;
--1 rows inserted;
सत्र 2:
alter table fg_test truncate partition p1;
--table truncated
सत्र 1:
rollback;
insert /*+append */ into table fg_test select * from fg_test where col >=1000;
--1 rows inserted;
,210
सत्र 2:
alter table fg_test truncate partition p1;
--this throws ORA-00054: resource busy and acquire with NOWAIT specified
--or timeout expired
Doc on Diret-Path Insert इस विषय पर बहुत अचानक है और सिर्फ कहते हैं:
डायरेक्ट-पथ सम्मिलित दौरान, डेटाबेस या मेज पर विशेष ताले प्राप्त (सभी विभाजनों पर एक विभाजित तालिका के)। नतीजतन, उपयोगकर्ता तालिका पर संचालन को समेकित सम्मिलित, अद्यतन या हटा नहीं सकते हैं, और समवर्ती अनुक्रमणिका निर्माण और संचालन की अनुमति नहीं है।
How Direct-Path INSERT Works यह नहीं बताता कि सभी विभाजनों के लिए लॉक की आवश्यकता क्यों है। और क्यों पारंपरिक सम्मिलन गैर-प्रभावित विभाजन को लॉक नहीं करता है? (मेरे अंतर्ज्ञान है कि ताला ब्लॉक स्तर पर किया जाता है)
पंक्ति स्तर पर परंपरागत सम्मिलित ताले, तालिका परिभाषा को इसे साझा किए जाने से रोकने के लिए साझा लॉक द्वारा भी संरक्षित किया जाता है। ओरेकल में कोई ब्लॉक-स्तरीय ताले नहीं हैं, यह सभी पंक्ति, (उप) विभाजन या तालिका स्तर है। –