Revertir la secuencia de SQL Server 2012
Frecuentes
Visto 7,853 veces
3
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?
2 Respuestas
1
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
-4
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 sql sql-server tsql sql-server-2012 rollback or haz tu propia pregunta.
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;
- rs.Creo que será mejor dejarlo así porque ¿qué sucede si modifico la secuencia y en ese momento otra conexión genera el siguiente valor? - VAAA
si tienes razon, es mejor dejarlo como esta. - rs.
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. - a_horse_with_no_name