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.
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


0