在Web服务中实际使用MySQL保存点?

时间:2009-02-26 18:46:05

标签: mysql database web-services transactions nested-transactions

是否有人可以使用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实际上工作了。

1 个答案:

答案 0 :(得分:1)

我通常倾向于避免SAVEPOINT,因为它可能使代码很难理解和验证。

在您发布的情况下,在单个交易中包装将取决于OrdersAuditOrders完全对应的记录是否属于您的业务规则。

编辑:只需重新阅读您的问题,您就无法保证OrdersAuditOrders之间的保证通信。所以我不会使用任何事务来插入OrdersAudit记录。