Pregunta tecnica sobre tablas....

18/08/2005 - 21:44 por Gabriel South | Informe spam
Hola!

Tengo una pregunta tecnica sobre funcionamiento de stored procedures y
tablas que diferentes PC´s ejecutan al mismo tiempo en un mismo Servidor
sql.

Tengo un stored procedure que hace lo siguiente (entre otras cosas):

PROCEDURE
Select @IDPROCESS=(select isnull(max(ESP_ID),0)+1 from esp010)

create table gertemp ( status char(1) NULL ... blablabla

INSERT INTO gertemp blablabla

// Modifica unos datos de la tabla "gertemp"

//y despues

Insert into ESP010 con los datos de gertemp + el campo @IDPROCESS

drop table gertemp
Retorno el @IDPROCESS al programa

o Sea, genero un identificador unico que es tomado de la tabla ESP

luego grabo la tabla temporaria "gertemp" con otros datos

despues paso esos datos a la tabla ESP010 mas un campo con el contenido de
@IDPROCESS

apago la tabla temporaria...
Retorno al programa aquel IDPROCESS

Luego el programa lee los registros de la tabla ESP usando como filtro aquel
IDPROCESS que generé...

Mi pregunta es la siguiente:
la tabla "gertemp" es "unica" por cada hilo de ejecucion??.. o sea no
interfiere si otra PC ejecuta el stored procedure "al mismo tiempo" (bue,
casi)...

Otra mas... aquel identificador unico que genero en IDPROCESS y que va a
incrementarse una vez que el stored procedure grabe otro registro en ESP,
puede duplicarse si otro PC ejecuta el SProcedure al mismo tiempo???...

Select @IDPROCESS=(select isnull(max(ESP_ID),0)+1 from esp010)

Los dos hilos de ejecucion pueden retornar el mismo numero???...

O no prociso preocuparme por todo eso porque el SQL da un semaforo a cada
proceso y nada interfiere con lo otro????

Bue, espero haberme explicado...

Gabriel.
 

Leer las respuestas

#1 Alejandro Mesa
18/08/2005 - 22:33 | Informe spam
Gabriel South,

Mi pregunta es la siguiente:
la tabla "gertemp" es "unica" por cada hilo de ejecucion??.. o sea no
interfiere si otra PC ejecuta el stored procedure "al mismo tiempo" (bue,
casi)...



Bueno, si me guio por el script que posteastes, te diria que si puedes tener
interferencias, pues la tabla "temporaria" del script es en realidad una
tabla permanente y no una tabla temporal como supones. Las tablas temporales
(tablas cuyo nombre comienza con el signo de numero # y las cuales pueden ser
locales o globales) locales son visibles solo dentro de la coneccion donde se
crean. Las tablas temporales globales son visibles por todas las conneciones
existentes despues de su creacion mientras esta exista. Puedes leer mas al
respecto en los libros en linea, bajo el topico "create table".

Otra mas... aquel identificador unico que genero en IDPROCESS y que va a
incrementarse una vez que el stored procedure grabe otro registro en ESP,
puede duplicarse si otro PC ejecuta el SProcedure al mismo tiempo???...

Select @IDPROCESS=(select isnull(max(ESP_ID),0)+1 from esp010)

Los dos hilos de ejecucion pueden retornar el mismo numero???...

O no prociso preocuparme por todo eso porque el SQL da un semaforo a cada
proceso y nada interfiere con lo otro????



Si se puede duplicar, puesto que el codigo no esta dentro de una transaccion
que ha su vez bloquee la tabla [espp10]. Te recomiendo crear una tabla donde
se guardara el valor corriente y un procedimiento almacenado encargado de
incrementar el valor y devolverlo en un parametro de salida. De esta forma,
puedes llamar al procedimiento desde otro procedimiento donde insertas la
data. Todo esto lo haces dentro de una transaccion, la cual debes tratar que
sea lo mas corta posible para que otros usuarios tengan acceso a los recursos
bloqueados por ella. Seria algo asi como:

create table dbo.contador (
c1 int not null
)
go

create trigger dbo.tr_contador_ins_del on dbo.contador
for insert, delete
as
if (select count(*) from dbo.contador != 1)
begin
rollback transaction
rasierror('La tabla [contador] debe tener un fila.', 16, 1)
end
go

insert into dbo.contador values(0)
go

create procedure dbo.usp_prox_num
@prox_num int output
as
set nocount on

update dbo.contador
set @prox_num = c1 = c1 + 1


return @@error
go

create procedure dbo.usp_ins_data
@p1 ..,
...
@pn ...
as
set nocount on

declare @rv int
declare @prox_num int
declare @error int

begin transaction

exec @rv = dbo.usp_prox_num @prox_num output

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

if @error != 0 goto ErrorHandler

create table #gertemp ( status char(1) NULL ... blablabla

if @error != 0 goto ErrorHandler

INSERT INTO #gertemp blablabla

if @error != 0 goto ErrorHandler


if @error != 0 goto ErrorHandler

Insert into ESP010 con los datos de gertemp + el campo @prox_num

if @error != 0 goto ErrorHandler

drop table #gertemp

commit transaction

return @@error

ErrorHandler:
if @@trancount > 0
rollback transaction
return -1
go


AMB

"Gabriel South" wrote:

Hola!

Tengo una pregunta tecnica sobre funcionamiento de stored procedures y
tablas que diferentes PC´s ejecutan al mismo tiempo en un mismo Servidor
sql.

Tengo un stored procedure que hace lo siguiente (entre otras cosas):

PROCEDURE
Select @IDPROCESS=(select isnull(max(ESP_ID),0)+1 from esp010)

create table gertemp ( status char(1) NULL ... blablabla

INSERT INTO gertemp blablabla

// Modifica unos datos de la tabla "gertemp"

//y despues

Insert into ESP010 con los datos de gertemp + el campo @IDPROCESS

drop table gertemp
Retorno el @IDPROCESS al programa

o Sea, genero un identificador unico que es tomado de la tabla ESP

luego grabo la tabla temporaria "gertemp" con otros datos

despues paso esos datos a la tabla ESP010 mas un campo con el contenido de
@IDPROCESS

apago la tabla temporaria...
Retorno al programa aquel IDPROCESS

Luego el programa lee los registros de la tabla ESP usando como filtro aquel
IDPROCESS que generé...

Mi pregunta es la siguiente:
la tabla "gertemp" es "unica" por cada hilo de ejecucion??.. o sea no
interfiere si otra PC ejecuta el stored procedure "al mismo tiempo" (bue,
casi)...

Otra mas... aquel identificador unico que genero en IDPROCESS y que va a
incrementarse una vez que el stored procedure grabe otro registro en ESP,
puede duplicarse si otro PC ejecuta el SProcedure al mismo tiempo???...

Select @IDPROCESS=(select isnull(max(ESP_ID),0)+1 from esp010)

Los dos hilos de ejecucion pueden retornar el mismo numero???...

O no prociso preocuparme por todo eso porque el SQL da un semaforo a cada
proceso y nada interfiere con lo otro????

Bue, espero haberme explicado...

Gabriel.



Preguntas similares