Me gustaría crear una interfaz para manipular facturas de una manera similar a la transacción.Transacción MySQL en muchas solicitudes PHP
La base de datos consta de una tabla de facturas, que contiene información de facturación, y una tabla de líneas de factura, que contiene líneas de pedido para las facturas. El sitio web es un conjunto de scripts que permiten la adición, modificación y eliminación de facturas y sus líneas correspondientes.
El problema que tengo es esto, me gustaría que las propiedades ACID de la base de datos se vean reflejadas en la aplicación web.
- Atómica: Cuando el usuario pulsa guardar, ya sea toda la factura se modifica o toda la factura no se cambia en absoluto.
- consistente: el código de la aplicación ya garantiza la coherencia, las líneas no se pueden agregar a las facturas inexistentes. Los ID de factura no se pueden duplicar.
- Aislado: Si un usuario está en medio de un conjunto de cambios en una factura, me gustaría ocultar esos cambios a otros usuarios hasta que el usuario haga clic en guardar.
- Durable: Si el sitio web muere, los datos deberían ser seguros. Esto ya funciona
Si estuviera escribiendo una aplicación de escritorio, sería mantener una conexión a la base de datos MySQL en todo momento, lo que me permite usar simplemente el BEGIN TRANSACTION y COMMIT al principio y al final de la edición.
Por lo que entiendo, no puede COMENZAR TRANSACCIÓN en una página de PHP y COMPROMETER en una página diferente porque la conexión se cierra entre páginas.
¿Hay alguna manera de hacer esto posible sin extensiones? Por lo que he encontrado, solo SQL Relay hace esto (pero es una extensión).
El problema con esta idea es que otro usuario podría editar los datos debajo de mí. Esto requiere un código adicional para rastrear los cambios en cada factura (es decir, número de revisión). Las transacciones nativas simplemente arrojarían un conflicto de compromiso y mi aplicación podría volver a lanzar eso al usuario. – Martin
@Martin: para solucionar los problemas de simultaneidad, agregue una columna de versión a la (s) tabla (s) para que un registro no se pueda actualizar/eliminar a menos que los valores de la versión coincidan entre lo que el usuario está editando actualmente y lo que el db almacena actualmente. –
En ese caso, debe crear un mecanismo de bloqueo pesimista u optimista para evitar que otro usuario lo haga. Pesimista al "bloquear" a otros usuarios basándose en una clave de una parte de la jerarquía en la que desea bloquear, u optimista (suponiendo que esto no ocurra a menudo) pidiéndoles que vuelvan a ingresar sus datos. –