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

cómo bloquear alguna fila ya que no se seleccionan en otra transacción

Parece que necesita algún tipo de marcador para identificar filas como "en uso" para que las otras instancias no procesen los mismos datos; si usa un tipo booleano o de fecha es irrelevante, de alguna manera debe marcar las filas en uso.

Puede hacerlo a través de un despachador, un proceso o hilo con acceso exclusivo a su tabla y cuyo único trabajo es seleccionar filas y pasarlas a otros procesos para trabajar. Incluso entonces, el despachador tendrá que saber hasta dónde han llegado los datos para que vuelvas al mismo problema.

Otra forma es usar un campo para indicar que la fila está en uso (como ha dicho en su pregunta). Cada proceso actualiza un bloque de filas con una identificación única, realizada dentro de una transacción para bloquear la tabla; Usaría el número de conexión devuelto por CONNECTION_ID() para marcarlos, entonces sabes que es único.

Después de UPDATE ... WHERE connection_id IS NULL (con un límite aplicado) la transacción está completa, el proceso puede SELECT ... WHERE connection_id = CONNECTION_ID() para obtener sus filas para su procesamiento.

Cuando han completado su trabajo, todo el ciclo comienza de nuevo para marcar el siguiente conjunto de filas hasta que todas hayan sido procesadas.