我想知道爲什麼批量插入(使用直接路徑)鎖定整個表,因此如果插入的話,我想知道核心原因(引擎的段,塊,鎖的機制)到一個分區,我不能截斷另一個不受影響(顯然)插入的分區。批量插入到分區表和表級別鎖
常規的插入物(沒有追加提示)允許截斷一些nonaffected分區。(注意,我談論非COMMITED事務。)
下面一個例子來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;
會議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是對這個問題很突然,只是說:
在直接路徑INSERT,數據庫取得對 表排他鎖(或上的所有分區的分區表)。因此, 用戶無法對錶執行任何併發插入,更新或刪除操作,並且不允許併發索引創建和構建 操作。
How Direct-Path INSERT Works不能解釋爲什麼所有分區都需要鎖定。 爲什麼傳統的插入不鎖定不受影響的分區? (我的直覺是,鎖在塊級進行)
傳統的行級別插入鎖定,表定義也受共享鎖保護以防止被修改。 Oracle中沒有任何塊級鎖,它是全部行,(子)分區或表級別。 – 2013-06-04 06:39:00