transacción base de datos sólo de comprometerse parcialmente
-
22-09-2019 - |
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 UPDATE
s no toman. Originalmente pensamos que podría ser que las cláusulas sobre los WHERE
UPDATE
s 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?
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.