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

Ejemplo mínimo de usar select... for update para aislar filas

SELECT ... FOR UPDATE bloquea las filas en modo exclusivo, lo que significa que la segunda selección no puede continuar hasta que la primera se haya completado o retrocedido. Esto se debe a que el resultado de la segunda selección podría verse afectado por el contenido de la fila que ha bloqueado, por lo que necesita obtener un bloqueo de lectura en la fila para verificar.

Si crea un UNIQUE INDEX en, por ejemplo, id , podrías hacer;

select * from SolrCoresPreallocated where id=1 for update;

en la primera transacción y;

select * from SolrCoresPreallocated where id=2 for update;

en la segunda de forma independiente, ya que el índice único permite que la segunda selección encuentre la fila correcta sin bloquear la lectura de la primera.

EDITAR:para obtener una fila "gratis" lo más rápido posible, la única forma es hacer dos transacciones;

  • COMENZAR/SELECCIONAR PARA ACTUALIZAR/ACTUALIZAR a ocupado/CONFIAR para obtener la fila.
  • BEGIN//UPDATE to free/COMMIT para procesar la fila y liberarla.

Esto significa que es posible que necesite acciones de compensación en caso de que un proceso falle y revierta la transacción que ACTUALIZARÍA la fila para liberarla, pero dado que MySQL (o SQL estándar para el caso) no tiene una noción de "obtener la siguiente fila desbloqueada ", no tienes muchas opciones.