¿Cómo lidiar con actualizaciones concurrentes en bases de datos?

¿Cuál es la forma común de lidiar con las actualizaciones simultáneas en una base de datos SQL?

Considere un esquema SQL simple (restricciones y valores predeterminados no mostrados ...) como

create table credits (
  int id,
  int creds,
  int user_id
);

La intención es almacenar algún tipo de créditos para un usuario, por ejemplo. algo así como la reputación de stackoverflow.

¿Cómo lidiar con las actualizaciones concurrentes de esa tabla? Algunas opciones:

update credits set creds= 150 where userid = 1;

En este caso, la aplicación recuperó el valor actual, calculó el nuevo valor (150) y realizó una actualización. Lo que deletrea el desastre si alguien más hace lo mismo al mismo tiempo. Supongo que resolver el resultado del valor actual y la actualización en una transacción lo resolvería, por ejemplo.Begin; select creds from credits where userid=1; do application logic to calculate new value, update credits set credits = 160 where userid = 1; end; En este caso, puede verificar si el nuevo crédito sería <0 y simplemente truncarlo a 0 si los créditos negativos no tienen sentido.

update credits set creds = creds - 150 where userid=1;

Este caso no tendría que preocuparse por las actualizaciones concurrentes, ya que la base de datos se encarga del problema de la coherencia, pero tiene la falla de que los créditos se volverían negativos, lo que podría no tener sentido para algunas aplicaciones.

Entonces, ¿cuál es el método aceptado para lidiar con el problema (bastante simple) descrito anteriormente, y si el db arroja un error?

Respuestas a la pregunta(9)

Su respuesta a la pregunta