是否有人可以使用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
实际上工作了。
答案 0 :(得分:1)
我通常倾向于避免SAVEPOINT,因为它可能使代码很难理解和验证。
在您发布的情况下,在单个交易中包装将取决于OrdersAudit
与Orders
完全对应的记录是否属于您的业务规则。
编辑:只需重新阅读您的问题,您就无法保证OrdersAudit
和Orders
之间的保证通信。所以我不会使用任何事务来插入OrdersAudit
记录。