有没有人有经验,可以使用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完全对应。

编辑:只需重新阅读您的问题,就无需保证OrdersAuditOrders之间的对应关系。因此,我不会使用任何事务来插入OrdersAudit记录。

07-25 22:43