有没有人有经验,可以使用MySQL savepoints(直接或通过ORM)共享,特别是在非平凡的Web服务中?您实际在哪里使用过它们?它们是否足够可靠(假设您愿意运行相对较新的MySQL版本)还是过于先进或昂贵?
最后,是否有人对以下用例有经验,您是否为此使用了保存点?说某些特定工作单元的要点是在同一事务中向Orders
表添加一行(或者,当然,不必与订单相关的任何内容)并更新OrdersAuditInfo
表。尽可能更新Orders
是至关重要的,但是OrdersAuditInfo
表不是那么重要(例如,可以将错误记录到文件中,但可以继续进行整个事务)。在较低的级别上可能看起来像这样(警告,后面是伪SQL):
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;
但是即使在这里,也许会有更好(或更常见)的成语?可以在完全不同的事务中插入
OrdersAuditInfo
,但是最好保证OrdersAuditInfo
表是而不是写入的,除非最终的COMMIT
实际起作用。 最佳答案
我通常倾向于避免使用SAVEPOINT,因为它会使代码很难理解和验证。
在您发布的情况下,包装在单个交易中将取决于业务规则中是否包含OrdersAudit
记录与Orders
完全对应。
编辑:只需重新阅读您的问题,就无需保证OrdersAudit
和Orders
之间的对应关系。因此,我不会使用任何事务来插入OrdersAudit
记录。