Transacciones y bloqueos

drcrs
16 de Julio del 2009
Hola! queria pedirles una ayuda con lo siguiente:
Tengo una base en sql server la cual tiene una tabla llamada "numerador". Dicha tabla tiene un campo "pedido" en donde se guarda el numero del proximo pedido a ingresar para una aplicacion.
Con lo cual cuando alguien carga un pedido, primero lee ese campo y luego lo actualiza incrementandolo (el incremento no es siempre en uno, es variable!)

El problema que tengo es que cuando hay mucha concurrencia, se crean pedidos con numero duplicado.

Queria saber cual es el mejor mecanismo que puedo implementar primero para que no se dupliquen los numeros y luego para que no haya problemas con bloqueos.

Les copio el ejemplo del codigo, muchas gracias a todos!
saludos

'La funcion devuelve el numero de pedido a utilizar
'Recibe el incremento que se aplicara en el numerador
Function Numerador (incremento)

Dim rsNumero
Set rsNumero = server.CreateObject("adodb.recordset")

Numerador=-1

'dbconn es una conexion ya abierta
dbConn.Begintrans

'Obtiene el numero de pedido
Set rsNumero = dbConn.Execute("SELECT pedido FROM numerador",,1)

'Error?
If Err.Number Then
dbConn.Rollbacktrans
dbConn.close
Set rsNumero = Nothing
Else

'Obtiene el nuevo numero de pedido
Numerador=rsNumero("pedido")
rsNumero.Close

'Actualiza el numerador de pedido
Set rsNumero = dbConn.Execute("UPDATE numerador SET pedido=pedido + " & incremento,,1)
If Err.Number Then
dbConn.Rollbacktrans
Set rsNumero = Nothing
set dbConn = Nothing
Numerador=-1
Else

'Commit
dbConn.Committrans
End If

End If

Set rsNumero = Nothing

End Function