Проблемы параллелизма с хранимой процедурой - PullRequest
0 голосов
/ 20 февраля 2012

Мне нужна помощь.У меня есть следующая хранимая процедура, но у меня есть проблемы с параллелизмом.Кто-нибудь может сказать мне, как изменить хранимую процедуру, чтобы избежать ошибки дублирующегося ключа, потому что два пользователя делают один и тот же выбор одновременно?Первичным ключом является поле IDSOLICITUD и таблица SOLIC, которая является числовой, и я хочу вставлять в эту таблицу счетчик каждый раз, когда вы обращаетесь к нему и возвращаете это значение вызывающему приложению.Структура таблицы я не могу изменить, я не могу поставить AutoNumber.

CREATE procedure PRC_SOLIC(FECHA IN DATE, IDTRAMITE IN VARCHAR2, ESTADO IN NUMBER, ESTADO_FECHA IN DATE, MENSAJE_ERROR IN VARCHAR2, CPROVIN IN NUMBER, CMUNICI IN NUMBER, NHABITA IN NUMBER, NDOMICI IN NUMBER, REFORIGEN IN VARCHAR2,OPERACION_TIPO IN VARCHAR2, OPERACION_CODIGO IN NUMBER, USUARIO IN VARCHAR2, FINALIDAD IN VARCHAR2, RESULTADO IN VARCHAR2,NUM OUT NUMBER) is

    v_Numero  NUMBER;

    CURSOR c_Solic is SELECT MAX(IDSOLICITUD)+1 FROM SOLIC;

BEGIN
  OPEN c_Solic;
  FETCH c_Solic INTO v_Numero;

  IF (v_Numero is NULL) THEN
    v_Numero := 1;
  END IF;

  INSERT INTO SOLIC VALUES (v_Numero, FECHA, IDTRAMITE, ESTADO, ESTADO_FECHA, MENSAJE_ERROR, CPROVIN, CMUNICI, NHABITA, 
  NDOMICI, REFORIGEN, OPERACION_TIPO, OPERACION_CODIGO, USUARIO, FINALIDAD, RESULTADO);    

  NUM := v_Numero;

  close c_Solic;


END PRC_SOLIC;

Спасибо.

Ответы [ 2 ]

1 голос
/ 20 февраля 2012

Ваши теги сбивают с толку, это Oracle или MySQL? Если Oracle, то посмотрите на использование последовательностей для такого рода вещей. См. Управление последовательностями . Затем вы можете создать последовательность, такую ​​как:

CREATE SEQUENCE IDSOLICITUD_SEQ
START WITH 1
INCREMENT BY 1;

А потом в вашем коде:

CURSOR c_Solic is SELECT IDSOLICITUD_SEQ.NEXTVAL FROM SYS.DUAL;
0 голосов
/ 20 февраля 2012

редактирование на основе невозможности использования автоинкремента

Ниже предполагается, что вы используете MySQL, для Oracle, пожалуйста, смотрите другой ответ

Поскольку вы не можете изменить его на AutoIncrement, вам, похоже, придется прибегнуть к явной блокировке таблицы с помощью LOCK TABLES

http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html

Это дает

CREATE procedure PRC_SOLIC(FECHA IN DATE, IDTRAMITE IN VARCHAR2, ESTADO IN NUMBER, ESTADO_FECHA IN DATE, MENSAJE_ERROR IN VARCHAR2, CPROVIN IN NUMBER, CMUNICI IN NUMBER, NHABITA IN NUMBER, NDOMICI IN NUMBER, REFORIGEN IN VARCHAR2,OPERACION_TIPO IN VARCHAR2, OPERACION_CODIGO IN NUMBER, USUARIO IN VARCHAR2, FINALIDAD IN VARCHAR2, RESULTADO IN VARCHAR2,NUM OUT NUMBER) is

BEGIN
  // Declare the variable which will hold the "AI" field
  DECLARE thisSolicID INT UNSIGNED DEFAULT 0;
  // Lock the table for writing
  LOCK TABLES SOLIC WRITE;
  // Get the "AI" value
  SELECT COALESCE(MAX(IDSOLICITUD),0)+1 INTO thisSolicID FROM FROM SOLIC;
  // Insert it
  INSERT INTO SOLIC VALUES (thisSolicID, FECHA, IDTRAMITE, ESTADO, ESTADO_FECHA, MENSAJE_ERROR, CPROVIN, CMUNICI, NHABITA, NDOMICI, REFORIGEN, OPERACION_TIPO, OPERACION_CODIGO, USUARIO, FINALIDAD, RESULTADO);    
  // Unlock the table
  UNLOCK TABLES;
END PRC_SOLIC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...