Информация об изменениях

Сообщение Oracle взаимная блокировка от 09.01.2023 12:04

Изменено 09.01.2023 12:06 Qt-Coder

Oracle взаимная блокировка
Есть таблица

CREATE TABLE TABLE1
(
  F1     NUMBER                            NOT NULL,
  F2     NUMBER                            NOT NULL,
  F3     NUMBER                            NOT NULL,
  F4     NUMBER                            DEFAULT (1),
  F5     TIMESTAMP(6)                      DEFAULT systimestamp,
  F6     TIMESTAMP(6),
  F7     NUMBER                            DEFAULT (0),
  F8     NUMBER                            DEFAULT (0),
  F9     TIMESTAMP(6),
  F10    NUMBER                            DEFAULT (0),
  F11    VARCHAR2(1000 BYTE),
  F12    VARCHAR2(1000 BYTE),
  F13    NUMBER                            DEFAULT (0),
  F14    VARCHAR2(2000 BYTE)
)
TABLESPACE TBL_SPACE
RESULT_CACHE (MODE DEFAULT)
PCTUSED    40
PCTFREE    20
INITRANS   10
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            NEXT             1M
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            FREELISTS        1
            FREELIST GROUPS  1
            BUFFER_POOL      DEFAULT
            FLASH_CACHE      DEFAULT
            CELL_FLASH_CACHE DEFAULT
           )
NOLOGGING 
NOCOMPRESS 
NOCACHE
NOPARALLEL
MONITORING;


Есть индекс
CREATE UNIQUE INDEX IND_F1_F2_UNIQUE ON TABLE1
(F1, F2)
NOLOGGING
TABLESPACE IDX_SPACE
PCTFREE    20
INITRANS   10
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            NEXT             1M
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            FREELISTS        1
            FREELIST GROUPS  1
            BUFFER_POOL      DEFAULT
            FLASH_CACHE      DEFAULT
            CELL_FLASH_CACHE DEFAULT
           )
NOPARALLEL;


То есть составной уникальный индекс на F1+F2.

Из нескольких потоков производится обновление таблицы кодом вида
UPDATE TABLE1 SET F3=:1, F4=:2 WHERE F1=:2 AND F2=:3


Условие WHERE для каждого потока уникально. То есть нет такого, чтобы 2 потока обновляли одну и ту же пару F1+F2.

Однако периодически прилетает ORA-00600 взаимная блокировка.

Подскажите в чем может быть дело? На каком ресурсе оно блокируется?
oracle sql
Oracle взаимная блокировка
Есть таблица

CREATE TABLE TABLE1
(
  F1     NUMBER                            NOT NULL,
  F2     NUMBER                            NOT NULL,
  F3     NUMBER                            NOT NULL,
  F4     NUMBER                            DEFAULT (1),
  F5     TIMESTAMP(6)                      DEFAULT systimestamp,
  F6     TIMESTAMP(6),
  F7     NUMBER                            DEFAULT (0),
  F8     NUMBER                            DEFAULT (0),
  F9     TIMESTAMP(6),
  F10    NUMBER                            DEFAULT (0),
  F11    VARCHAR2(1000 BYTE),
  F12    VARCHAR2(1000 BYTE),
  F13    NUMBER                            DEFAULT (0),
  F14    VARCHAR2(2000 BYTE)
)
TABLESPACE TBL_SPACE
RESULT_CACHE (MODE DEFAULT)
PCTUSED    40
PCTFREE    20
INITRANS   10
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            NEXT             1M
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            FREELISTS        1
            FREELIST GROUPS  1
            BUFFER_POOL      DEFAULT
            FLASH_CACHE      DEFAULT
            CELL_FLASH_CACHE DEFAULT
           )
NOLOGGING 
NOCOMPRESS 
NOCACHE
NOPARALLEL
MONITORING;


Есть индекс
CREATE UNIQUE INDEX IND_F1_F2_UNIQUE ON TABLE1
(F1, F2)
NOLOGGING
TABLESPACE IDX_SPACE
PCTFREE    20
INITRANS   10
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            NEXT             1M
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            FREELISTS        1
            FREELIST GROUPS  1
            BUFFER_POOL      DEFAULT
            FLASH_CACHE      DEFAULT
            CELL_FLASH_CACHE DEFAULT
           )
NOPARALLEL;


То есть составной уникальный индекс на F1+F2.

Из нескольких потоков производится обновление таблицы кодом вида
UPDATE TABLE1 SET F3=:1, F4=:2 WHERE F1=:3 AND F2=:4


Условие WHERE для каждого потока уникально. То есть нет такого, чтобы 2 потока обновляли одну и ту же пару F1+F2.

Однако периодически прилетает ORA-00600 взаимная блокировка.

Подскажите в чем может быть дело? На каком ресурсе оно блокируется?
sql oracle