El control de la concurrencia se programa usando las transacciones SQL; las cuales son una o varias sentencias sql que se ejecutan como una sola LUW (unidad logica de trabajo)
El control de transacciones concurrentes en una base de datos brinda un eficiente desempeño en un Motor de Datos, puesto que permite controlar la ejecución de transacciones que operan en paralelo, accesando a información compartida y, por lo tanto, interfiriendo potencialmente unas con otras...
Junto con la programacion transaccional es recomendable a veces cambiar el bloqueo (tipo de acceso que se permite a un elemento) .... el defecto es nivel de pagina ; por lo que cambiarlo a nivel de Row ayudaria bastante (esto ultimo depende del motor que estas usando; ya que no todos permiten a nivel de fila).
Te voy a poner un ejemplo de una transaccion en un procedimiento almacenado para que te hagas una idea de que significa trabajar con aplicaciones sql que manejen la concurrencia...
la clave es el BEGIN TRAN ... COMMIT o ROLLBACK END TRAN
create procedure spa_adp_eli_anotaciones (
@cd_empresa smallint,
@id_proyecto int,
@fc_anotacion datetime)
AS
BEGIN TRAN
declare @error int,
@msg varchar(255)
-- Elimina Anotacion
delete from SGC_ANOTACIONES
where cd_empresa = @cd_empresa
and id_proyecto = @id_proyecto
and fc_anotacion = @fc_anotacion
select @error=@@error
if @error != 0
begin
select @msg = "*** ERROR AL ELIMINAR ANOTACION ***"
goto fin
end
-- Commit de transaccion
commit tran
select 0 RETORNO, @msg MSG
return
-- Subrutinas
fin:
rollback tran
select -1 RETORNO, @msg MSG
return
go
Espero te sirva
Saludos