Como bloquear/desbloquear una tabla en SQL?

23/08/2005 - 19:44 por Gabriel South | Informe spam
Hola,

Tengo una pregunta tecnica para hacerles. Resulta que en un stored procedure
quiero bloquear temporariamente una tabla para trabajar con ella y no
liberarla hasta que finalice el procedimiento, por ahora lo estoy haciendo
con BEGIN TRANSACTION... pero queria saber si hay algun metodo/instruccion
para bloquear alguna tabla especifica sin usar el BEGINT TRAN

Gracias, Gabriel..

Preguntas similare

Leer las respuestas

#6 Gabriel South
23/08/2005 - 21:03 | Informe spam
Alejandro, la verdad es que estoy dentro de un SP, y lo unico que queria era
asegurarme que otro processo no inserte un registro antes que yo termine de
insertar el mio...

Tipo asi:

1) MiID=Select max(ID)+1 from tabla1

2) Ejecuto algunos calculos

3) Insert into tabla1 MiID, otros datos,etc.etc

Entre el Select max (1) y el insert into (3) otro proceso puede ir y hacer
otro Select Max y retornar el mismo ID que estoy obteniendo, puesto que
todavia no hice el INSERT INTO TABLA1 con MiID... ¿ok?

Lo que hice fue poner un BEGIN TRAN antes del select max y un commit tran
despues del Insert into supongo que eso es suficiente(!?)

Bue, eso es todo


Cualquier sugerencia, bienvenida.

Gabriel.



"Alejandro Mesa" wrote in message
news:
Gabriel puedes crear un procedimiento almacenado encargado de incrementar


la
columna y devolver ese valor.

create procedure dbo.p1
@next_id int output
as
set nocount on

update t1
set @next_id = c1 = c1 + 1

return @@error
go

create procedure dbo.p2
@p1 int,
@p2 varchar(25)
as
set nocount on

declare @rv int
declare @error int
declare @next_id int

begin transaction

exec @rv = dbo.p1 @next_id output

set @error = coalesce(nullif(@rv, 0), @@error)

if @error != 0 goto ErrorHandler

insert into t1(c1, c2, c3)
values(@next_id, @p1, @p2)

set @error = @@error

if @error != 0 goto ErrorHandler

commit transaction

return @@error

ErrorHandler:
if @@trancount > 0
begin
rollback transaction
raiserror('Error insertando tal y mas cual entidad.', 16, 1)
end
go


AMB

"Gabriel South" wrote:

> Hola maxi..
>
> Lo siguiente, preciso obtener un numero de un campo que otros procesos
> (sistemas) autonumeran (incrementando, usando sus propios metodos) y


sumarle
> 1.
> Una vez sumado, yo genero otro registro con datos y ese numero.
> Cabe aclarar que ese numero es unico y primary key.
>
> La tabla es bloqueada por muy poco tiempo, solo el tiempo que tarda en


tomar
> ese numero e insertar el registro, de esa forma me aseguro que otros
> procesos no esten insertando algun registro con mi numero.
>
> Da para entender?
>
> Gracias...
>
>
>
> "Maxi" wrote in message
> news:#
> > Hola, bloquear toda una tabla no es para nada una buena idea!! que


hace
> ese
> > proceso?
> >
> >
> > Salu2
> > Maxi
> >
> >
> > "Gabriel South" escribió en el mensaje
> > news:
> > > Hola,
> > >
> > > Tengo una pregunta tecnica para hacerles. Resulta que en un stored
> > > procedure
> > > quiero bloquear temporariamente una tabla para trabajar con ella y


no
> > > liberarla hasta que finalice el procedimiento, por ahora lo estoy
> haciendo
> > > con BEGIN TRANSACTION... pero queria saber si hay algun
> metodo/instruccion
> > > para bloquear alguna tabla especifica sin usar el BEGINT TRAN
> > >
> > > Gracias, Gabriel..
> > >
> > >
> > >
> >
> >
>
>
>
Respuesta Responder a este mensaje
#7 Alejandro Mesa
23/08/2005 - 22:23 | Informe spam
Entonces asegurate de usar un hint en la lectura para bloquear la tabla.

begin transaction

Select @mid = max(ID)+1 from tabla1 WITH (TABLOCK, HOLDLOCK)

2) Ejecuto algunos calculos

3) Insert into tabla1 MiID, otros datos,etc.etc



commit transaction
go

De la forma que yo lo hago es actualizando la columna [id] en tabla1 dentro
de la transaccion, eso hara que nadie puede actualizarla hasta que la
transaccion termine.


AMB


"Gabriel South" wrote:

Alejandro, la verdad es que estoy dentro de un SP, y lo unico que queria era
asegurarme que otro processo no inserte un registro antes que yo termine de
insertar el mio...

Tipo asi:

1) MiID=Select max(ID)+1 from tabla1

2) Ejecuto algunos calculos

3) Insert into tabla1 MiID, otros datos,etc.etc

Entre el Select max (1) y el insert into (3) otro proceso puede ir y hacer
otro Select Max y retornar el mismo ID que estoy obteniendo, puesto que
todavia no hice el INSERT INTO TABLA1 con MiID... ¿ok?

Lo que hice fue poner un BEGIN TRAN antes del select max y un commit tran
despues del Insert into supongo que eso es suficiente(!?)

Bue, eso es todo


Cualquier sugerencia, bienvenida.

Gabriel.



"Alejandro Mesa" wrote in message
news:
> Gabriel puedes crear un procedimiento almacenado encargado de incrementar
la
> columna y devolver ese valor.
>
> create procedure dbo.p1
> @next_id int output
> as
> set nocount on
>
> update t1
> set @next_id = c1 = c1 + 1
>
> return @@error
> go
>
> create procedure dbo.p2
> @p1 int,
> @p2 varchar(25)
> as
> set nocount on
>
> declare @rv int
> declare @error int
> declare @next_id int
>
> begin transaction
>
> exec @rv = dbo.p1 @next_id output
>
> set @error = coalesce(nullif(@rv, 0), @@error)
>
> if @error != 0 goto ErrorHandler
>
> insert into t1(c1, c2, c3)
> values(@next_id, @p1, @p2)
>
> set @error = @@error
>
> if @error != 0 goto ErrorHandler
>
> commit transaction
>
> return @@error
>
> ErrorHandler:
> if @@trancount > 0
> begin
> rollback transaction
> raiserror('Error insertando tal y mas cual entidad.', 16, 1)
> end
> go
>
>
> AMB
>
> "Gabriel South" wrote:
>
> > Hola maxi..
> >
> > Lo siguiente, preciso obtener un numero de un campo que otros procesos
> > (sistemas) autonumeran (incrementando, usando sus propios metodos) y
sumarle
> > 1.
> > Una vez sumado, yo genero otro registro con datos y ese numero.
> > Cabe aclarar que ese numero es unico y primary key.
> >
> > La tabla es bloqueada por muy poco tiempo, solo el tiempo que tarda en
tomar
> > ese numero e insertar el registro, de esa forma me aseguro que otros
> > procesos no esten insertando algun registro con mi numero.
> >
> > Da para entender?
> >
> > Gracias...
> >
> >
> >
> > "Maxi" wrote in message
> > news:#
> > > Hola, bloquear toda una tabla no es para nada una buena idea!! que
hace
> > ese
> > > proceso?
> > >
> > >
> > > Salu2
> > > Maxi
> > >
> > >
> > > "Gabriel South" escribió en el mensaje
> > > news:
> > > > Hola,
> > > >
> > > > Tengo una pregunta tecnica para hacerles. Resulta que en un stored
> > > > procedure
> > > > quiero bloquear temporariamente una tabla para trabajar con ella y
no
> > > > liberarla hasta que finalice el procedimiento, por ahora lo estoy
> > haciendo
> > > > con BEGIN TRANSACTION... pero queria saber si hay algun
> > metodo/instruccion
> > > > para bloquear alguna tabla especifica sin usar el BEGINT TRAN
> > > >
> > > > Gracias, Gabriel..
> > > >
> > > >
> > > >
> > >
> > >
> >
> >
> >



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