¿Esto es secuencialidad?

23/11/2005 - 17:21 por César | Informe spam
Esto se usa para gestionar la creación de una nueva clave para la tabla
clientes, sin hacer uso por supuesto de campos identity autincrmentales y
tal. Y por supuesto la razón de esta tabla auxiliar PA_key es para que cuando
se bloquee, sea ésta y no toda la tabla de clientes que sería un poco burrada
porque impediria joins en la transacción.
Mi pregunta es ¿como me aseguro de que una transacción no se mete entre
medias del curso de otra? la cual consultaria datos inconsistentes. ¿Deberia
bloquear PA_key?¿Como lo hago? graciassssss

begin tran
select @ult_nro = ult_nro_cliente from PA_key
set @ult_nro = @ult_nro + 1
insert clientes (clienteId) select cienteId + @ult_nro
update PA_key set ult_nro_cliente = @ult_nro
commint tran

Preguntas similare

Leer las respuestas

#1 Isaias
23/11/2005 - 17:28 | Informe spam
El BEGIN TRAN, te asegura que NINGUNA otra transaccion, dara inicio, hasta en
tanto, no termine la que inicio dicha transaccion.


Saludos
IIslas


"César" escribió:

Esto se usa para gestionar la creación de una nueva clave para la tabla
clientes, sin hacer uso por supuesto de campos identity autincrmentales y
tal. Y por supuesto la razón de esta tabla auxiliar PA_key es para que cuando
se bloquee, sea ésta y no toda la tabla de clientes que sería un poco burrada
porque impediria joins en la transacción.
Mi pregunta es ¿como me aseguro de que una transacción no se mete entre
medias del curso de otra? la cual consultaria datos inconsistentes. ¿Deberia
bloquear PA_key?¿Como lo hago? graciassssss

begin tran
select @ult_nro = ult_nro_cliente from PA_key
set @ult_nro = @ult_nro + 1
insert clientes (clienteId) select cienteId + @ult_nro
update PA_key set ult_nro_cliente = @ult_nro
commint tran



Respuesta Responder a este mensaje
#2 Alejandro Mesa
23/11/2005 - 21:56 | Informe spam
César,

De esa forma no garantizas que otra coneccion lea el mismo valor de la tabla
PA_key e inserte el incremento mientras esta coneccion leyo el mismo valor e
incremento y cuando trata de insertar da la casualidad que ese valor ya
existe. La transaccion no esta bloqueando la tabla PA_key despues de la
lectura, para eso debes usar un "locking hint" como UPDLOCK.

begin tran
select @ult_nro = ult_nro_cliente from PA_key (UPDLOCK)
set @ult_nro = @ult_nro + 1
insert clientes (clienteId) select cienteId + @ult_nro
update PA_key set ult_nro_cliente = @ult_nro
commint tran

preferible que uses este patron:

begin tran
update PA_key set @ult_nro = ult_nro_cliente = ult_nro_cliente + 1

if @@error > 0 goto fail

insert clientes (clienteId) select cienteId + @ult_nro

if @@error > 0 goto fail

commint tran

return @@error

fail:
rollback transaction
return -1
go


AMB

"César" wrote:

Esto se usa para gestionar la creación de una nueva clave para la tabla
clientes, sin hacer uso por supuesto de campos identity autincrmentales y
tal. Y por supuesto la razón de esta tabla auxiliar PA_key es para que cuando
se bloquee, sea ésta y no toda la tabla de clientes que sería un poco burrada
porque impediria joins en la transacción.
Mi pregunta es ¿como me aseguro de que una transacción no se mete entre
medias del curso de otra? la cual consultaria datos inconsistentes. ¿Deberia
bloquear PA_key?¿Como lo hago? graciassssss

begin tran
select @ult_nro = ult_nro_cliente from PA_key
set @ult_nro = @ult_nro + 1
insert clientes (clienteId) select cienteId + @ult_nro
update PA_key set ult_nro_cliente = @ult_nro
commint tran



Respuesta Responder a este mensaje
#3 Pau Domínguez
24/11/2005 - 16:06 | Informe spam
Hola César.
Pégale un vistacillo al documento de esta web y lo tendrás todo más claro.
http://www.sqlgurus.org/dotnetnuke/...fault.aspx
Suerte.
Pau.

"César" <Cé escribió en el mensaje
news:
Esto se usa para gestionar la creación de una nueva clave para la tabla
clientes, sin hacer uso por supuesto de campos identity autincrmentales y
tal. Y por supuesto la razón de esta tabla auxiliar PA_key es para que
cuando
se bloquee, sea ésta y no toda la tabla de clientes que sería un poco
burrada
porque impediria joins en la transacción.
Mi pregunta es ¿como me aseguro de que una transacción no se mete entre
medias del curso de otra? la cual consultaria datos inconsistentes.
¿Deberia
bloquear PA_key?¿Como lo hago? graciassssss

begin tran
select @ult_nro = ult_nro_cliente from PA_key
set @ult_nro = @ult_nro + 1
insert clientes (clienteId) select cienteId + @ult_nro
update PA_key set ult_nro_cliente = @ult_nro
commint tran



Respuesta Responder a este mensaje
#4 Maxi [MVP]
25/11/2005 - 03:30 | Informe spam
Gracias por hacer link a mis documentos ;-)


Salu2
-
[MVP] SQL Server
Orador para Culminis Latam
www.sqlgurus.org



"Pau Domínguez" escribió en el mensaje
news:%
Hola César.
Pégale un vistacillo al documento de esta web y lo tendrás todo más claro.
http://www.sqlgurus.org/dotnetnuke/...fault.aspx
Suerte.
Pau.

"César" <Cé escribió en el mensaje
news:
Esto se usa para gestionar la creación de una nueva clave para la tabla
clientes, sin hacer uso por supuesto de campos identity autincrmentales y
tal. Y por supuesto la razón de esta tabla auxiliar PA_key es para que
cuando
se bloquee, sea ésta y no toda la tabla de clientes que sería un poco
burrada
porque impediria joins en la transacción.
Mi pregunta es ¿como me aseguro de que una transacción no se mete entre
medias del curso de otra? la cual consultaria datos inconsistentes.
¿Deberia
bloquear PA_key?¿Como lo hago? graciassssss

begin tran
select @ult_nro = ult_nro_cliente from PA_key
set @ult_nro = @ult_nro + 1
insert clientes (clienteId) select cienteId + @ult_nro
update PA_key set ult_nro_cliente = @ult_nro
commint tran







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