¿Alguien tiene experiencia que puedan compartir usando MySQL savepoints (directamente oa través de un ORM), especialmente en un servicio web no trivial? ¿Dónde los has usado realmente? ¿Son lo suficientemente confiables (suponiendo que estés dispuesto a ejecutar una versión bastante reciente de MySQL) o demasiado vanguardistas o caros?¿Utiliza en el mundo real los puntos de almacenamiento de MySQL en servicios web?
Por último, ¿alguien tiene experiencia con algo como el siguiente caso de uso y usaste puntos de seguridad para él? Supongamos que el punto principal de una unidad de trabajo específica es agregar una fila a una tabla Orders
(o lo que sea, no tiene que estar relacionado con la orden, por supuesto) y actualizar una tabla OrdersAuditInfo
, en la misma transacción. Es esencial que Orders
se actualice si es posible, pero la tabla OrdersAuditInfo
no es tan esencial (por ejemplo, está bien simplemente registrar un error en un archivo, pero continúe con la transacción en general). En un nivel bajo que podría tener este aspecto (advertencia, pseudo-SQL sigue):
BEGIN;
INSERT INTO Orders(...) VALUES (...);
/* Do stuff outside of SQL here; if there are problems, do a
ROLLBACK and report an error (i.e., Order is invalid in this
case anyway). */
SAVEPOINT InsertAudit;
INSERT INTO OrdersAudit(...) VALUES(...);
/* If the INSERT fails, log an error to a log file somewhere and do: */
ROLLBACK TO SAVEPOINT InsertAudit;
/* Always want to commit the INSERT INTO Orders: */
COMMIT;
Pero incluso en este caso tal vez no sería una mejor (o al menos más común) modismo? Uno podría hacer el inserto OrdersAuditInfo
en una transacción completamente diferente, pero sería bueno tener la garantía de que la tabla OrdersAuditInfo
fuera no escrita a menos que el COMMIT
final realmente funcionara.
La razón por la que quería que OrdersAudit fuera parte de la transacción general era en el caso en que la inserción en Orders falla en el momento de COMMIT por algún motivo. –