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.

Preguntas similare

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.



Respuesta Responder a este mensaje
#2 Maxi
19/08/2005 - 19:41 | Informe spam
Hola, mira como ayuda te diria que leas este articulo mio, donde expongo un
algoritmo para poder hacer este tipo de cosas.

http://www.microsoft.com/spanish/ms...art187.asp


Salu2
Maxi


"Gabriel South" escribió en el mensaje
news:
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.


Respuesta Responder a este mensaje
#3 Gabriel South
22/08/2005 - 15:51 | Informe spam
Gracias por los esclarecimientos...

Gabriel.
Respuesta Responder a este mensaje
#4 Gabriel South
22/08/2005 - 16:00 | Informe spam
Hola Alejandro...

Ya modifique la tabla temporaria para el sufijo # (fue un pequeño error de
codigo, jejeje!)... pues bien

Con respecto a la segunda cuestion, (autonumero en ESP), acontece que otro
sistema genera registros en esta tabla y tiene su propio metodo para generar
el campo R_E_C_N_O_, por lo que no puedo tener una tabla con un contador
para esto...

Si la solucion es poner esto dentro de un begin trans, eso voy a hacer, para
que bloquee temporariamente la tabla ESP y asi no haya otro usuario
intentando generar en la misma.

Gracias por tu ayuda...

Gabriel.




"Alejandro Mesa" wrote in message
news:
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.
>
>
>
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida