grabar varios reg simultaneos

18/03/2008 - 12:20 por Hugo Gsell | Informe spam
Utilizo sql server 2000...
Ha esta altura esta pregunta es para matarme...
aunque no muy elegante (por el mecanismo) este código de abajo lo que hace
es grabar un nuevo registro en una tabla.
Dicha tabla tiene un campo clave que es IdMiReg.
Independientemente "de la eficiencia"* la pregunta es si esto esta dentro de
un procedimiento almacenado y ademas esto dentro de un BEGIN TRANSACTION...
si supongamos EN LA EXAGERACION simultaneamente 500 usuarios le dan el enter
y comienzan a ejecutar este SP ¿Funcionaría?, es decir, ¿se generarían
valores DISTINTOS de IdMiReg?
...
BEGIN TRANSACTION
SELECT @NuevoNro = ISNULL(MAX(IdMiReg),0) FROM MiTabla
SET @NuevoNro = @NuevoNro + 1
INSERT INTO MiTabla ( IdBetaAfi,
Campo1
Campo2)
VALUES(
@NuevoNro,
@campo1
@campo2)
SELECT @error = @@ERROR, @NroRegsModificados = @@ROWCOUNT
IF @error != 0
BEGIN
ROLLBACK TRANSACTION
END
ELSE
BEGIN
COMMIT TRANSACTION
END


*me refiero a la eficiencia ya que podríamos tener una tabla con el nro de
siguiente registro... .etc etc... No se discute el mecanismo si si
funcionaría o no como se presenta
 

Leer las respuestas

#1 Maxi Accotto
18/03/2008 - 13:28 | Informe spam
Hola, asi como esta podes tener valores duplicados, fijate este ejemplo
donde es la forma correcta de manejar los numeradores

Tu codigo hace un select y no estas bloqueando con lo cual si hay otra
operacion en el mismo tiempo puede obtener el mismo numero

use northwind
go

create table numeradora (comprobante varchar(30),
ultimo_numero int)
go

insert into numeradora values ('oc',0)

create table oc (numero int,
fecha datetime not null)
go


create proc usp_garbar_oc @fecha datetime
as

declare @proximo_numero int

begin tran

update numeradora
set @proximo_numero = ultimo_numero = ultimo_numero + 1
where comprobante = 'OC'

INSERT INTO OC VALUES (@proximo_numero,@fecha)

commit tran
go

select * from oc

select * from numeradora

exec usp_garbar_oc '20080310'

select * from oc

select * from numeradora

exec usp_garbar_oc '20080311'

select * from oc

select * from numeradora



Microsoft MVP SQLServer
www.sqltotalconsulting.com
-

"Hugo Gsell" escribió en el mensaje de
noticias:
Utilizo sql server 2000...
Ha esta altura esta pregunta es para matarme...
aunque no muy elegante (por el mecanismo) este código de abajo lo que hace
es grabar un nuevo registro en una tabla.
Dicha tabla tiene un campo clave que es IdMiReg.
Independientemente "de la eficiencia"* la pregunta es si esto esta dentro
de un procedimiento almacenado y ademas esto dentro de un BEGIN
TRANSACTION... si supongamos EN LA EXAGERACION simultaneamente 500
usuarios le dan el enter y comienzan a ejecutar este SP ¿Funcionaría?, es
decir, ¿se generarían valores DISTINTOS de IdMiReg?
...
BEGIN TRANSACTION
SELECT @NuevoNro = ISNULL(MAX(IdMiReg),0) FROM MiTabla
SET @NuevoNro = @NuevoNro + 1
INSERT INTO MiTabla ( IdBetaAfi,
Campo1
Campo2)
VALUES(
@NuevoNro,
@campo1
@campo2)
SELECT @error = @@ERROR, @NroRegsModificados = @@ROWCOUNT
IF @error != 0
BEGIN
ROLLBACK TRANSACTION
END
ELSE
BEGIN
COMMIT TRANSACTION
END


*me refiero a la eficiencia ya que podríamos tener una tabla con el nro de
siguiente registro... .etc etc... No se discute el mecanismo si si
funcionaría o no como se presenta

Preguntas similares