Discussion:
Como bloquear/desbloquear una tabla en SQL?
(demasiado antiguo para responder)
Gabriel South
2005-08-23 17:44:06 UTC
Permalink
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......
Maxi
2005-08-23 17:45:20 UTC
Permalink
Hola, bloquear toda una tabla no es para nada una buena idea!! que hace ese
proceso?
--
--------------------------
Salu2
Maxi
Post by Gabriel South
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......
Gabriel South
2005-08-23 17:59:52 UTC
Permalink
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...
Post by Maxi
Hola, bloquear toda una tabla no es para nada una buena idea!! que hace ese
proceso?
--
--------------------------
Salu2
Maxi
Post by Gabriel South
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
Post by Maxi
Post by Gabriel South
para bloquear alguna tabla especifica sin usar el BEGINT TRAN....
Gracias, Gabriel......
Alejandro Mesa
2005-08-23 18:11:02 UTC
Permalink
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
Post by Gabriel South
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...
Post by Maxi
Hola, bloquear toda una tabla no es para nada una buena idea!! que hace
ese
Post by Maxi
proceso?
--
--------------------------
Salu2
Maxi
Post by Gabriel South
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
Post by Maxi
Post by Gabriel South
con BEGIN TRANSACTION... pero queria saber si hay algun
metodo/instruccion
Post by Maxi
Post by Gabriel South
para bloquear alguna tabla especifica sin usar el BEGINT TRAN....
Gracias, Gabriel......
Gabriel South
2005-08-23 19:03:13 UTC
Permalink
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.
Post by Alejandro Mesa
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
go
create procedure dbo.p2
@p1 int,
@p2 varchar(25)
as
set nocount on
begin transaction
insert into t1(c1, c2, c3)
commit transaction
begin
rollback transaction
raiserror('Error insertando tal y mas cual entidad.', 16, 1)
end
go
AMB
Post by Gabriel South
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...
Post by Maxi
Hola, bloquear toda una tabla no es para nada una buena idea!! que hace
ese
Post by Maxi
proceso?
--
--------------------------
Salu2
Maxi
Post by Gabriel South
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
Post by Maxi
Post by Gabriel South
con BEGIN TRANSACTION... pero queria saber si hay algun
metodo/instruccion
Post by Maxi
Post by Gabriel South
para bloquear alguna tabla especifica sin usar el BEGINT TRAN....
Gracias, Gabriel......
Alejandro Mesa
2005-08-23 20:23:11 UTC
Permalink
Entonces asegurate de usar un hint en la lectura para bloquear la tabla.

begin transaction
Post by Gabriel South
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
Post by Gabriel South
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...
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.
Post by Alejandro Mesa
Gabriel puedes crear un procedimiento almacenado encargado de incrementar
la
Post by Alejandro Mesa
columna y devolver ese valor.
create procedure dbo.p1
@next_id int output
as
set nocount on
update t1
go
create procedure dbo.p2
@p1 int,
@p2 varchar(25)
as
set nocount on
begin transaction
insert into t1(c1, c2, c3)
commit transaction
begin
rollback transaction
raiserror('Error insertando tal y mas cual entidad.', 16, 1)
end
go
AMB
Post by Gabriel South
Hola maxi..
Lo siguiente, preciso obtener un numero de un campo que otros procesos
(sistemas) autonumeran (incrementando, usando sus propios metodos) y
sumarle
Post by Alejandro Mesa
Post by Gabriel South
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
Post by Alejandro Mesa
Post by Gabriel South
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...
Post by Maxi
Hola, bloquear toda una tabla no es para nada una buena idea!! que
hace
Post by Alejandro Mesa
Post by Gabriel South
ese
Post by Maxi
proceso?
--
--------------------------
Salu2
Maxi
Post by Gabriel South
Hola,
Tengo una pregunta tecnica para hacerles. Resulta que en un stored
procedure
quiero bloquear temporariamente una tabla para trabajar con ella y
no
Post by Alejandro Mesa
Post by Gabriel South
Post by Maxi
Post by Gabriel South
liberarla hasta que finalice el procedimiento, por ahora lo estoy
haciendo
Post by Maxi
Post by Gabriel South
con BEGIN TRANSACTION... pero queria saber si hay algun
metodo/instruccion
Post by Maxi
Post by Gabriel South
para bloquear alguna tabla especifica sin usar el BEGINT TRAN....
Gracias, Gabriel......
Maxi
2005-08-23 18:10:15 UTC
Permalink
Hola, mmm te entiendo a medias!! probaste de usar triggers?
--
--------------------------
Salu2
Maxi
Post by Gabriel South
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...
Post by Maxi
Hola, bloquear toda una tabla no es para nada una buena idea!! que hace
ese
Post by Maxi
proceso?
--
--------------------------
Salu2
Maxi
Post by Gabriel South
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
Post by Maxi
Post by Gabriel South
con BEGIN TRANSACTION... pero queria saber si hay algun
metodo/instruccion
Post by Maxi
Post by Gabriel South
para bloquear alguna tabla especifica sin usar el BEGINT TRAN....
Gracias, Gabriel......
Gabriel South
2005-08-23 18:15:33 UTC
Permalink
Me olvide de decir, seria un bloqueo solo para insercion... permitiendo a
otros procesos modificar los datos...
Loading...