Primero, esos rollback que tienes infiltrados muy sospechosos. Eso es definitivamente un error. Lo normal es que una transaccion encapsula las internas, en vez de retroceder en CADA intento.
Segundo, lo que describes es fácil de explicar:
- Maquina 1 @ 10pm => SELECT...
- Maquina 2 @ 10::01pm => INSERT...
La BD esta andando correcto, y este es tu algoritmo. No hay como decir que el "código" que usas es el ULTIMO código entre TODOS los participantes. Lo que tienes es "el ultimo código en ESTE INSTANTE".
Es distinto!
La forma correcta es que al MOMENTO de solicitar el código te "adueñas de el" y le avanzas el contador. Maso así:
Cita:
Tabla Codigos:
Id:...
Codigo: Int <- El siguiente
|
Código SQL
[-]
UPDATE Codigos SET Codigo = Codigo + 1
OUTPUT INSERTED. Codigo
WHERE Id = @Id
La diferencia:
Tu algoritmo
Lo que quieres
Código:
Actual = 1
Maquina1 =
Capturar 1
Actual = 2
Maquina2 =
Capturar 2
Actual = 3