Я создал одну таблицу разделов в Oracle 11g и попытался вставить записи, используя многопоточность из пакетного задания Java. Предположим, что если у меня есть 10 потоков, & каждый хочет вставить/обновить 1 миллион записей одновременно или навалом вставить некоторое время без потоков, в обоих случаях наша таблица была заблокирована оракулом для того же сеанса. Если у нас есть 10 потоков, мы получили 20 записей для 10 сеансов для одной таблицы. Это происходит только для раздела или раздела с таблицами подсетей.Таблица разделов блокируется для параллельных операций DML в Oracle
Ниже создать таблицу запроса
CREATE TABLE "SEG_TEST_SINGLE_PARTITION"
(
"POR_CD" CHAR(2 CHAR) NOT NULL ENABLE,
"PROD_MNTH" CHAR(6 CHAR) NOT NULL ENABLE,
"INS_DTTM" TIMESTAMP (6)
)
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE
(
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT
)
TABLESPACE "a" PARTITION BY LIST
(
"POR_CD"
)
(
PARTITION "PWKLY_ORDR_POR01" VALUES
(
'01'
)
SEGMENT CREATION IMMEDIATE PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(INITIAL 8388608 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "a" ,
PARTITION "PWKLY_ORDR_POR02" VALUES
(
'02'
)
SEGMENT CREATION DEFERRED PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "a" ,
PARTITION "PWKLY_ORDR_POR03" VALUES
(
'03'
)
SEGMENT CREATION DEFERRED PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "a" ,
PARTITION "PWKLY_ORDR_POR06" VALUES
(
'06'
)
SEGMENT CREATION DEFERRED PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "a" ,
PARTITION "PWKLY_ORDR_POR15" VALUES
(
'15'
)
SEGMENT CREATION DEFERRED PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "a" ,
PARTITION "PWKLY_ORDR_POR20" VALUES
(
'20'
)
SEGMENT CREATION DEFERRED PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "a" ,
PARTITION "PWKLY_ORDR_PORDF" VALUES
(
DEFAULT
)
SEGMENT CREATION DEFERRED PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "a"
);
К ниже запроса, я проверил таблицу блокировки
select a.INST_ID,a.XIDUSN,a.XIDSLOT,a.XIDSQN,a.OBJECT_ID,b.OBJECT_NAME,a.SESSION_ID,a.ORACLE_USERNAME,a.OS_USER_NAME,a.PROCESS,LOCKED_MODE from
GV$LOCKED_OBJECT a,dba_objects b where a.object_id=b.object_id and ORACLE_USERNAME like '%ASP01%' order by 8;
"INST_ID" "XIDUSN" "XIDSLOT" "XIDSQN" "OBJECT_ID" "OBJECT_NAME" "SESSION_ID" "ORACLE_USERNAME" "OS_USER_NAME" "PROCESS" "LOCKED_MODE"
3 58 16 424487 3235818 "PLAN_TABLE$" 2447 "ASP1" "z013" "15140" 3
так как сейчас я не имею блокировку для выше созданной таблицы, теперь я побегу Вставить запрос без фиксации и проверки блокировки agian от SQL Developer (или из любой точки мира)
Insert into SEG_TEST_SINGLE_PARTITION (POR_CD,PROD_MNTH,INS_DTTM) values ('02','201607',to_timestamp('15-DEC-16 11.15.09.000000000 PM','DD-MON-RR HH.MI.SS.FF AM'));
1 row inserted
Блокировка запросов
select a.INST_ID,a.XIDUSN,a.XIDSLOT,a.XIDSQN,a.OBJECT_ID,b.OBJECT_NAME,a.SESSION_ID,a.ORACLE_USERNAME,a.OS_USER_NAME,a.PROCESS,LOCKED_MODE from
GV$LOCKED_OBJECT a,dba_objects b where a.object_id=b.object_id and ORACLE_USERNAME like '%ASP01%' order by 8;
результата с перегородкой таблица (SEG_TEST_SINGLE_PARTITON) в качестве имени объекта
"INST_ID" "XIDUSN" "XIDSLOT" "XIDSQN" "OBJECT_ID" "OBJECT_NAME" "SESSION_ID" "ORACLE_USERNAME" "OS_USER_NAME" "PROCESS" "LOCKED_MODE"
3 58 16 424487 3235818 "PLAN_TABLE$" 2447 "ASP01" "z013" "15140" 3
3 139 5 56366 3929061 "SEG_TEST_SINGLE_PARTITION" 3339 "ASP01" "z013" "31624" 3
3 139 5 56366 3929063 "SEG_TEST_SINGLE_PARTITION" 3339 "ASP01" "z013" "31624" 3
Теперь мы хотели бы знать, почему мы получать tablelock для одной таблицы в два раза с таким же session_id (3339), который вызывает длительную задержку при вставке через Java многопоточность или налив вставить и несколько раз зависать на основе размера данных?
см Также это http://www.orafaq.com/forum/t/197448/ подобного объяснения тому, что я - пытаюсь рассказать. –
Привет, Руж, я пробовал увеличивать initrans, но доцент работал для меня и все еще стоял перед блокировкой с той же session_id, которая ждет долгое время. Спасибо за ваш ценный ответ. –