Revertir la secuencia de SQL Server 2012

Tengo un objeto de secuencia de SQL Server 2012:

/****** Create Sequence Object ******/
CREATE SEQUENCE TestSeq
START WITH 1
INCREMENT BY 1;

Tengo un SP que ejecuta algunas consultas dentro de una transacción:

BEGIN TRAN

SELECT NEXT VALUE FOR dbo.TestSeq

<here all the query update code......>

ROLLBACK TRAN

Si la transacción falla, todas las actualizaciones se revierten sin problemas, pero la Secuencia no se revierte, supongo porque está fuera del alcance de la transacción.

¿Alguna pista sobre cómo manejar eso?

preguntado el 25 de agosto de 12 a las 01:08

no puede revertir la secuencia, no admite transacciones, lo que puede hacer es almacenar la secuencia actual en una variable y puede modificar la secuencia en el bloque de excepción si ocurre algún error, por ejemplo: Alter SEQUENCE TestSeq RESTART WITH @var INCREMENT BY 1; -

Creo que será mejor dejarlo así porque ¿qué sucede si modifico la secuencia y en ese momento otra conexión genera el siguiente valor? -

si tienes razon, es mejor dejarlo como esta. -

Las secuencias son más rápidas (y generan menos conflictos de bloqueo) porque no se pueden revertir. Así funcionan las secuencias en todos los DBMS (Oracle, PostgreSQL, Firebird, DB2, ...). No se preocupe por los valores "desperdiciados" o las lagunas en sus identificaciones generadas. -

2 Respuestas

Declare una tabla que almacene todos los números de secuencia y luego use una declaración como la que se muestra a continuación:

declarar @SequenceNo int

    UPDATE MySequenceNumberTable
    SET @SequenceNo = SequenceNo = SequenceNo + 1
    WHERE SequenceName = 'Your sequence name'

Aquí, la declaración única incrementa el valor, asigna a la variable y actualiza la tabla DB para garantizar su acción atómica. Dado que es una operación de actualización de base de datos simple, juega un papel dentro de la transacción de base de datos. Si la transacción se revierte, el valor del campo SequenceNo se revierte a su valor anterior.

La única captura es la próxima transacción que requiere el siguiente valor para el mismo nombre de secuencia y debe esperar hasta que la primera transacción se confirme o revierta debido al bloqueo de nivel de fila. En el caso de la secuencia DB, no hay bloqueo de secuencia, por lo que nunca bloquea otras transacciones que requieren el siguiente valor.

En nuestro caso, simplemente no podemos tener agujeros y necesitamos protección de concurrencia, por lo que usamos el método anterior y funciona bien para nosotros.

Respondido 21 Jul 15, 11:07

Tienes que ser cuidado con las tablas de secuencia. Pueden convertirse en un cuello de botella importante en los sistemas de gran volumen y, si no tiene cuidado con la forma en que recupera y actualiza los valores, puede obtener duplicados en sus aplicaciones de llamadas. - alroc

La declaración ROLLBACK se usa de la siguiente manera para cancelar una transacción completa:

BEGIN TRANSACTION
...
SQL Statement(s)

...
ROLLBACK TRANSACTION

El comando ROLLBACK también se puede usar para cancelar parte de una transacción de la siguiente manera:

BEGIN TRANSACTION
...
SQL Statement(s)

SAVE TRANSACTION savepoint_name

SQL Statement(s)

ROLLBACK TRANSACTION savepoint_name

Respondido el 08 de Septiembre de 12 a las 16:09

No estoy del todo seguro de haber entendido la pregunta: Andrew barbero

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.