Pregunta

Tengo un procedimiento almacenado de T-SQL que se ejecuta en un servidor de base de datos Sybase ASE que a veces está fallando para cometer todas sus operaciones, a pesar de que se completa sin excepción. He aquí un ejemplo aproximado de lo que hace.

BEGIN TRANSACTION

UPDATE TABLE1
SET FIELD1 = @NEW_VALUE1
WHERE KEY1 = @KEY_VALUE1

IF @@error <> 0 OR @@rowcount <> 1 BEGIN
    ROLLBACK
    RETURN 1
END

UPDATE TABLE2
SET FIELD2 = @NEW_VALUE2
WHERE KEY2 = @KEY_VALUE2

IF @@error <> 0 OR @@rowcount <> 1 BEGIN
    ROLLBACK
    RETURN 2
END

INSERT TABLE2 (FIELD2, FIELD3)
VALUES (@NEW_VALUE3a, @NEW_VALUE3b)

IF @@error <> 0 OR @@rowcount <> 1 BEGIN
    ROLLBACK
    RETURN 3
END

COMMIT TRANSACTION
RETURN 0

El procedimiento se llama por lo menos cientos de veces al día. En un pequeño porcentaje de los casos (probablemente <3%), sólo las confirmaciones de los estados INSERT. Que se complete el proc y devuelve 0, pero los dos UPDATEs no toman. Originalmente pensamos que podría ser que las cláusulas sobre los WHERE UPDATEs no fueron coincidentes nada, así que hemos añadido la lógica IF @@rowcount. Pero incluso con esos cheques en allí, el INSERT sigue sucediendo y el procedimiento todavía está completando y devolviendo 0.

Estoy buscando ideas sobre lo que podría causar este tipo de problema. ¿Hay algo en la forma en que las transacciones de SQL trabajo, o la forma en que trabaja específicamente Sybase, que podría estar causando el COMMIT no cometer todo? ¿Hay algo acerca de mis bloques IF que podría permitir que la actualización no coincide con nada pero el procedimiento a seguir? Alguna otra idea?

¿Fue útil?

Solución

se es posible que sean de renovaciones, pero algo está cambiando los valores de nuevo? trate de añadir un activador de actualización de las tablas y dentro de ese desencadenador de inserción en una tabla de registro. para las filas que parecen no han sido actualizados mirada en el registro, es que hay una fila o no?

Otros consejos

Al no saber cómo configurar los valores de las variables, se me ocurre que si el valor de @ NEW_VALUE1 es el mismo que el valor anterior de Campo1, la actualización tendría éxito y sin embargo, parece no haber cambiado nada hacer que se piensa la transacción no hubiera pasado nada.

También podría tener un disparador que está afectando a la actualización.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top