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

Optimización de lógica MySql

El problema es que está intentando usar el bloqueo de nivel de MySQL para garantizar que un ticket no se pueda asignar a más de una persona. De esta forma, no hay forma de detectar si un usuario ha bloqueado un ticket.

Implementaría un bloqueo de nivel de aplicación agregando 2 campos relacionados con el bloqueo a la tabla de tickets:una marca de tiempo cuando se aplicó el bloqueo y un campo de identificación de usuario que indica qué usuario tiene el bloqueo. Los campos relacionados con el bloqueo pueden estar en otra tabla (el carrito de compras, por ejemplo, puede usarse para este propósito).

Cuando un usuario selecciona un ticket, intenta actualizar estos campos de bloqueo con una declaración de actualización condicional:

update tickets
set lock_time=now(), lock_user=...
where ticket_id=... and lock_time is null

Valores en lugar de ... son proporcionados por su aplicación. lock_time is null Existe un criterio para asegurarse de que si otro usuario ya seleccionó el ticket, el último usuario no anule el bloqueo. Después de la declaración de actualización, verifique la cantidad de filas afectadas. Si es uno, entonces el usuario actual adquirió el bloqueo. Si es 0, alguien más bloqueó el ticket.

Si tiene los datos de bloqueo en otra tabla, coloque una restricción única en el campo de identificación del ticket en esa tabla y use insertar para adquirir un bloqueo. Si la inserción tiene éxito, entonces se adquiere el bloqueo. Si falla, otro usuario ha bloqueado el ticket.

El bloqueo generalmente se mantiene durante una cantidad de minutos, después de eso, su aplicación debe liberar el bloqueo (establecer campos de bloqueo en nulo o eliminar el registro de bloqueo de la otra tabla).