Identity

28/11/2003 - 00:28 por Daniel Carrizales | Informe spam
Estimados Amigo

Tengo un problema con el Identity de una tabla. SQL server
2000.

El problema se resume en que se esta insertando y
actualizando en una de pedidos cuya llave es un campo con
propiedad Identity que se incremente de 1 en 1.

Bueno les comento que se me estan perdiendo registros ya
que no se estan manteniendo la secuencia de la llave, no
tengo la menor idea del porque sucede esto, si tubieran
alguna información les agradeceré que me lo envíen por
correo, supongo que debe ser por bloqueos de la Base de
datos que existen dos registros que compiten por el mismo
recurso pero uno de ellos no puede escribir y por lo tanto
se salta la propiedad del Identity

mil gracias a todos uds por su ayuda.


Daniel

Preguntas similare

Leer las respuestas

#11 ulises
30/11/2003 - 06:20 | Informe spam
Voy a tomarme la libertad de responder por Javier, que el identity no
soporta transacciones indica que a pesar del ROLLBAK realizado el
campo identity se mantiene en el último número que procesó. Lo podemos
ver con un ejemplo :

create table #temp ( cont int identity (1,1), valor char(3) )
go
BEGIN TRAN
insert into #temp ( valor ) values ('A')
COMMIT TRAN
SELECT * FROM #temp

daría como resultado

cont valor
1 A

si luego de eso hacemos una transacción con ROLLBAK como la que sigue
:
BEGIN TRAN
insert into #temp ( valor ) values ('B-1')
SELECT * FROM #temp
ROLLBACK TRAN
SELECT * FROM #temp

obtendremos los siguientes resultados :

cont valor
1 A
2 B-1

cont valor
1 A

lo cual es correcto hasta el momento, si luego procesamos otra
transacción satisfactoria :

BEGIN TRAN
insert into #temp ( valor ) values ('B-2')
COMMIT TRAN
SELECT * FROM #temp

tendremos el siguiente resultado :

cont valor
1 A
3 B-2

como podrás ver ha quedado un hueco en la secuencia.

Saludos,
Ulises

On Sat, 29 Nov 2003 21:42:32 -0700, "Antonio Ortiz"
wrote:

Hola Javier,

Disculpa la insistencia, pero aun no me queda claro. Esto es de mi especial
interes.

Utilizo trasacciones, todas mis tablas tienen un campo 'identity'. En una
estrategia similar a:

INICIO Transaccion
actualizaciones
Si Falla entonces ROLLBACK
FIN de Transaccion

Que es lo que pasa si hago un rollbak?, no se cancela toda la transaccion? o
si agregue nuevos registros, el identity, continuara en ultimo numero?, a
eso te refieres con 'el identity NO vuelve al estado previo' ?

(En mis simulaciones de errores, la trasaccion se cancela completamente,
cuento con MSDE 1.0 y Access 2000 como cliente)

Gracias

Antonio Ortiz Ramirez
asesor en sistemas

www.aortiz.net
Respuesta Responder a este mensaje
#12 Javier Loria
30/11/2003 - 16:26 | Informe spam
Hola:
Lo unico que agregaria a la muy completa exposicion de Ulises, es que si
requieres un consecutivo (Ejemplo: NumeroFacturas, NumeroOrden,
NumeroRecibo, etc.), es mejor trabajar con la sintaxis:
SELECT COALESCE(MAX(NumeroFactura),0)+1
FROM Facturas
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
ulises escribio:
Voy a tomarme la libertad de responder por Javier, que el identity no
soporta transacciones indica que a pesar del ROLLBAK realizado el
campo identity se mantiene en el último número que procesó. Lo podemos
ver con un ejemplo :

create table #temp ( cont int identity (1,1), valor char(3) )
go
BEGIN TRAN
insert into #temp ( valor ) values ('A')
COMMIT TRAN
SELECT * FROM #temp

daría como resultado

cont valor
1 A

si luego de eso hacemos una transacción con ROLLBAK como la que sigue



BEGIN TRAN
insert into #temp ( valor ) values ('B-1')
SELECT * FROM #temp
ROLLBACK TRAN
SELECT * FROM #temp

obtendremos los siguientes resultados :

cont valor
1 A
2 B-1

cont valor
1 A

lo cual es correcto hasta el momento, si luego procesamos otra
transacción satisfactoria :

BEGIN TRAN
insert into #temp ( valor ) values ('B-2')
COMMIT TRAN
SELECT * FROM #temp

tendremos el siguiente resultado :

cont valor
1 A
3 B-2

como podrás ver ha quedado un hueco en la secuencia.

Saludos,
Ulises

On Sat, 29 Nov 2003 21:42:32 -0700, "Antonio Ortiz"
wrote:

Hola Javier,

Disculpa la insistencia, pero aun no me queda claro. Esto es de mi
especial interes.

Utilizo trasacciones, todas mis tablas tienen un campo 'identity'.
En una estrategia similar a:

INICIO Transaccion
actualizaciones
Si Falla entonces ROLLBACK
FIN de Transaccion

Que es lo que pasa si hago un rollbak?, no se cancela toda la
transaccion? o si agregue nuevos registros, el identity, continuara
en ultimo numero?, a eso te refieres con 'el identity NO vuelve al
estado previo' ?

(En mis simulaciones de errores, la trasaccion se cancela
completamente, cuento con MSDE 1.0 y Access 2000 como cliente)

Gracias

Antonio Ortiz Ramirez
asesor en sistemas

www.aortiz.net
Respuesta Responder a este mensaje
#13 Antonio Ortiz
01/12/2003 - 09:22 | Informe spam
Perfectamente comprendido, muchas gracias

En realidad no me interesa mucho que se regrese el autonumerico, pero si la
consistencia de los datos.


Saludos

Antonio Ortiz Ramirez
asesor en sistemas

www.aortiz.net
www.progvisual.com



"Javier Loria" escribió en el mensaje
news:#
Hola:
Lo unico que agregaria a la muy completa exposicion de Ulises, es que


si
requieres un consecutivo (Ejemplo: NumeroFacturas, NumeroOrden,
NumeroRecibo, etc.), es mejor trabajar con la sintaxis:
SELECT COALESCE(MAX(NumeroFactura),0)+1
FROM Facturas
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
ulises escribio:
> Voy a tomarme la libertad de responder por Javier, que el identity no
> soporta transacciones indica que a pesar del ROLLBAK realizado el
> campo identity se mantiene en el último número que procesó. Lo podemos
> ver con un ejemplo :
>
> create table #temp ( cont int identity (1,1), valor char(3) )
> go
> BEGIN TRAN
> insert into #temp ( valor ) values ('A')
> COMMIT TRAN
> SELECT * FROM #temp
>
> daría como resultado
>
> cont valor
> 1 A
>
> si luego de eso hacemos una transacción con ROLLBAK como la que sigue
>>
> BEGIN TRAN
> insert into #temp ( valor ) values ('B-1')
> SELECT * FROM #temp
> ROLLBACK TRAN
> SELECT * FROM #temp
>
> obtendremos los siguientes resultados :
>
> cont valor
> 1 A
> 2 B-1
>
> cont valor
> 1 A
>
> lo cual es correcto hasta el momento, si luego procesamos otra
> transacción satisfactoria :
>
> BEGIN TRAN
> insert into #temp ( valor ) values ('B-2')
> COMMIT TRAN
> SELECT * FROM #temp
>
> tendremos el siguiente resultado :
>
> cont valor
> 1 A
> 3 B-2
>
> como podrás ver ha quedado un hueco en la secuencia.
>
> Saludos,
> Ulises
>
> On Sat, 29 Nov 2003 21:42:32 -0700, "Antonio Ortiz"
> wrote:
>
>> Hola Javier,
>>
>> Disculpa la insistencia, pero aun no me queda claro. Esto es de mi
>> especial interes.
>>
>> Utilizo trasacciones, todas mis tablas tienen un campo 'identity'.
>> En una estrategia similar a:
>>
>> INICIO Transaccion
>> actualizaciones
>> Si Falla entonces ROLLBACK
>> FIN de Transaccion
>>
>> Que es lo que pasa si hago un rollbak?, no se cancela toda la
>> transaccion? o si agregue nuevos registros, el identity, continuara
>> en ultimo numero?, a eso te refieres con 'el identity NO vuelve al
>> estado previo' ?
>>
>> (En mis simulaciones de errores, la trasaccion se cancela
>> completamente, cuento con MSDE 1.0 y Access 2000 como cliente)
>>
>> Gracias
>>
>> Antonio Ortiz Ramirez
>> asesor en sistemas
>>
>> www.aortiz.net


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida