sql >> Base de Datos >  >> RDS >> Mysql

MySQL operaciones atómicas y bloqueo de tablas

Estás muy cerca de tu diseño, pero no del todo.

En primer lugar, la mesa de su evento debe contener la cantidad de entradas que aún están disponibles para su evento (además de cualquier otra cosa que desee allí).

En segundo lugar, su tabla de depósito en garantía debe tener una columna DATETIME que indique cuándo vence el depósito en garantía. Debe establecer ese valor cada vez que los boletos entren en depósito.

En tercer lugar, la transacción de poner boletos en custodia debe

  1. bloquear la fila de eventos.
  2. lea la columna de entradas disponibles. (abortar si no hay suficientes disponibles)
  3. insertar una fila en la tabla de custodia
  4. actualice la fila del evento para disminuir la columna de entradas disponibles.
  5. desbloquear la fila de eventos.

En cuarto lugar, la acción de completar la venta debe eliminar la fila de depósito en garantía e insertar una fila de boleto vendido. Esto no es difícil.

Quinto, necesita una operación de limpieza de depósito en garantía. Esto debe buscar todas las filas de depósito en garantía que hayan vencido (que tengan una fecha de vencimiento en el pasado) y, para cada una:

  1. bloquear la fila de eventos correspondiente.
  2. lea el número de boletos en depósito en la tabla de depósito en garantía
  3. borrar la fila de la tabla de custodia.
  4. actualice la fila del evento para incrementar la columna de entradas disponibles.
  5. desbloquear la fila de eventos.

El truco es tener el número de disponibles las entradas se mantienen de forma que se entrelazan correctamente, de modo que las condiciones de carrera entre los usuarios no sobrevendan su evento.