【问题标题】:Real-world uses of MySQL savepoints in web services?Web 服务中 MySQL 保存点的实际用途?
【发布时间】:2009-02-26 18:46:05
【问题描述】:

有没有人可以分享使用 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 确实有效。

【问题讨论】:

    标签: mysql web-services transactions nested-transactions


    【解决方案1】:

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

    在您发布的情况下,是否包含在单个事务中取决于具有与 Orders 完全对应的 OrdersAudit 记录是否是您的业务规则的一部分。

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

    【讨论】:

    • 我希望 OrdersAudit 成为整个事务的一部分的原因是,由于某种原因,在 COMMIT 时插入 Orders 失败。
    【解决方案2】:

    我相信您正在使用保存点来避免失败的INSERTs 回滚整个事务。但在这种情况下,最好的方法是使用INSERT IGNORE。如果失败,您将收到警告而不是错误,并且不会回滚。

    既然不需要回滚,建议不要使用事务。

    SAVEPOINTs 如果您可能想要回滚一些成功的语句(但不是所有语句),那就太好了。例如:

    1. 开始交易;
    2. 您不想经常运行的相对较慢的查询
    3. 插入到一个
    4. 保存点一;
    5. SELECT id INTO @id FROM slot WHERE status = 'free' ORDER BY timestamp LIMIT 1;
    6. INSERT INTO b (slot_id, ...) VALUES (@id, ...)
    7. INSERT INTO c (slot_id, ...) VALUES (@id, ...)
    8. INSERT INTO d (slot_id, ...) VALUES (@id, ...)
    9. 提交;

    如果SELECT 没有返回任何内容,您可以运行全局ROLLBACK。如果以下任何插入失败,您可以ROLLBACK TO SAVEPOINT one 并选择另一个id。显然,在这种情况下,您希望在代码中实现最大尝试次数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      • 2014-06-19
      • 2015-12-24
      • 2020-10-06
      • 1970-01-01
      • 2010-10-17
      相关资源
      最近更新 更多