Estoy construyendo un sistema bancario en NodeJS y una base de datos SQL. Las dos funcionalidades principales que necesito son depositar y retirar. Quiero asegurarme de que no haya condiciones de carrera.
Ejemplo: el usuario tiene un saldo de 100 $ y retira 100 $ dos veces rápidamente y termina con -100 $.
¿La siguiente consulta puede tener condiciones de carrera?
update account set balance = balance - x where balance > x
Si esto no resuelve el problema:
Si uso PostgreSQL, ¿será suficiente una restricción de verificación en mi columna de saldo para eliminar todas las condiciones de carrera?
Si uso MySQL, ¿cuáles son mis opciones?
Tengo curiosidad sobre cuáles son las diferentes formas de lograr esto tanto en PostgreSQL como en MySQL.
Entonces, puedes hacer lo siguiente:
withdraw() , es decir, inicie una nueva transacción.SELECT .. FOR UPDATE para leer el registroUPDATE el valor Ahora, cuando el usuario intente retirarse dos veces rápidamente, una de las llamadas iniciará la transacción y emitirá la llamada SELECT.. FOR UPDATE , que bloqueará la lectura de datos del otro subproceso. Solo se desbloqueará una vez que finalice el primer subproceso, es decir, evitará la race condition .
Aquí está la documentación de MySQL al respecto.