SQL - Control de concurrencia en insercion de registros

 
Vista:

Control de concurrencia en insercion de registros

Publicado por widman widenar (17 intervenciones) el 23/06/2002 02:29:59
Hola amigos quiero que me digan como puedo aislar dos inserciones de registros simultaneamente
en una tabla de mi base de datos en SQL Server 7.0 para que no se inserte con la misma clave primaria que en este caso
es el valor maximo sgte es decir mi proc. almacenado que llamo desde ASP es:
CREATE PROCEDURE inserta_reg
AS
DECLARE @max_reg INT
DECLARE @error INT
BEGIN TRAN
SET @max_reg=(SELECT MAX(nro_registro) FROM mi_tabla)
INSERT INTO mi_tabla(nro_registro,campo1,campo2,...) VALUES(@nro_registro,valor1,valor2,...)
SELECT @error=@@ERROR
IF @error=0
COMMIT TRAN --Confirmo transaccion
ELSE
ROLLBACK TRAN --Cancelo transaccion
END

Mi clave es nro_registro el cual en cada nuevo registro se insertara el maximo valor sgte para lo cual hago
esa operacion en el proc. almacenado, pero no se que es lo que pasa pues cuando dos usuarios simultaneamente
insertan un registro desde una pagina web via ASP se produce un error diciendo que uno de ellos ha tratado de insertar un
valor duplicado de mi clave primaria es decir los dos usuarios toman el mismo valor de nro_registro por lo cual
se produce el error es decir si nro_registro era 300 y dos usuarios insertan simultanemante uno de ellos logra registrar
el 301 pero el otro no ya que ha tratado de insertar tambien el valor de 301 lo cual da error por duplicidad en clave primaria, lo cual segun
mi proc. alamacenado deberia de ser 302.

Espero hacerme entender y espero ansiosamente cualquier sugerencia sobre que es lo que estoy haciendo mal
o es que pasa por algun parametro a configurar en el SQL o algun valor del sistema.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Control de concurrencia en insercion de registr

Publicado por Islas, Isaías (5072 intervenciones) el 24/06/2002 17:08:13
Hola

Si acaso, solamente le faltaria colocarle un NOMBRE a su transacción, por lo demas, yo veo bien el codigo.

CREATE PROCEDURE inserta_reg
AS
DECLARE @max_reg INT
DECLARE @error INT
BEGIN TRAN Mytransaccion
SET @max_reg=(SELECT MAX(nro_registro) FROM mi_tabla)
INSERT INTO mi_tabla(nro_registro,campo1,campo2,...) VALUES(@nro_registro,valor1,valor2,...)
SELECT @error=@@ERROR
IF @error=0
COMMIT TRAN Mytransaccion --Confirmo transaccion
ELSE
ROLLBACK TRAN Mytransaccion --Cancelo transaccion
END

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Control de concurrencia en insercion de registr

Publicado por EDLERIO (540 intervenciones) el 24/06/2002 19:19:56
Creo que debes de guardar la variable @max_reg + 1 y no @nro_registro que ni declarada esta ...

Verificalo por favor...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar