(Nota: esto es para el servidor MS SQL)SQL Server Condición de condición Pregunta
Supongamos que tiene una tabla ABC con una columna de identidad de clave principal y una columna CODE. Queremos que cada fila aquí tenga un código único, generado secuencialmente (basado en alguna fórmula típica de dígito de control).
Digamos que tiene otra tabla DEF con una sola fila, que almacena el siguiente CÓDIGO disponible (imagine un autonumero simple).
sé lógica, como a continuación presentaría una condición de carrera, en la que dos usuarios podrían terminar con el mismo código:
1) Run a select query to grab next available code from DEF
2) Insert said code into table ABC
3) Increment the value in DEF so it's not re-used.
Sé que, dos usuarios pueden llegar a atascarse en el paso 1), y podría terminar con el mismo CÓDIGO en la tabla ABC.
¿Cuál es la mejor manera de manejar esta situación? Pensé que podría simplemente incluir un "begin tran"/"commit tran" en esta lógica, pero no creo que funcionó. Tenía un procedimiento almacenado como este para probar, pero no evitó la condición de carrera cuando me encontré a partir de dos ventanas diferentes en la EM:
begin tran
declare @x int
select @x= nextcode FROM def
waitfor delay '00:00:15'
update def set nextcode = nextcode + 1
select @x
commit tran
Puede alguien arrojar alguna luz sobre esto? Pensé que la transacción impediría que otro usuario pueda acceder a mi NextCodeTable hasta que se complete la primera transacción, pero creo que mi comprensión de las transacciones es defectuosa.
EDIT: intenté mover la espera a después de la declaración de "actualización", y obtuve dos códigos diferentes ... pero sospeché eso. Tengo la declaración de espera allí para simular un retraso para que la condición de carrera se pueda ver fácilmente. Creo que el problema clave es mi percepción incorrecta de cómo funcionan las transacciones.
Debe revisar mi respuesta tardía: el aceptado uno no es correcta ... – gbn