Necesito bloquear una tabla completa (no una sola fila) con doctrina, me gustaría hacer esto sin consultas nativas si es posible.Cómo bloquear una tabla completa en symfony2 con doctrine2?
La documentación para pessimistic locking sólo describe cómo bloquear entidades específicas a través de estos métodos:
- EntityManager # find
- EntityManager # bloquear
- consulta # setLockMode
tengo una transacción que necesita insertar una fila cuyos valores dependen de los valores del resto de las filas en la tabla, así que debo evitar que dos transacciones realicen una al mismo tiempo en esa mesa.
Estoy usando una demarcación de transacción explícita, que se supone que funciona bien con el bloqueo (de acuerdo con la documentación anterior).
NOTA: El bloqueo optimista no es lo suficientemente bueno en este caso, no puedo permitirme volver a intentar la transacción. Además, la consulta no debe ser lenta, por lo que el rendimiento no es un problema.
EDIT: Voy a dar un ejemplo. Imagine que desea construir un autoincremento a mano, y debe seleccionar max() de la tabla para obtener el resultado anterior para insertar el siguiente. Debe asegurarse de que no haya dos transacciones que intenten insertar el mismo valor en caso de que seleccionen max() al mismo tiempo.
Estoy buscando una solución general a este problema cuando auto_increment no es bueno, por ejemplo con cadenas, o columnas múltiples, hash o cualquier cálculo que tenga que hacer en la fila anterior.
El bloqueo es una solución sólida y, a diferencia del bloqueo optimista, no tiene que volver a intentar errores.
Entonces, ¿hay alguna manera de utilizar el bloqueo de tabla en doctrina?
Imo, una mejor opción sería la de abrir una transacción, busque los datos de la tabla que necesita a través de una consulta de selección y luego realice la actualización. – JamesHalsall
El problema es que si una segunda transacción se produce antes de que la primera se comprometa, la segunda transacción insertará un valor no válido. El resultado de la segunda transacción también debe depender de la fila insertada por la primera. Es por eso que necesito bloquear, las transacciones no deben superponerse para esa tabla. – Jens