【问题标题】:How to test for 2-phase commit behavior on a stored procedure?如何测试存储过程的两阶段提交行为?
【发布时间】:2010-07-15 13:33:03
【问题描述】:

这个特定的存储过程执行归档清除:
1) 从事务数据库中选择令牌
2) 将令牌放入临时表中
3) 遍历令牌:
3.1) 使用临时表中的令牌,从事务表中检索数据并插入到单独存档数据库中的表中(通过联合)
3.2) COMMIT 插入。
3.3) 然后这次使用相同的令牌从事务中删除数据
3.4) COMMIT 删除。


2 阶段提交允许我们在循环结束时只有一个提交

我的问题是如何模拟场景以使 proc 在插入阶段或删除阶段失败?这是为了确保即使运行失败,数据仍保持完整性 - 没有半处理令牌等。

【问题讨论】:

    标签: stored-procedures distributed-transactions


    【解决方案1】:

    为了强制执行运行时错误,我通常在代码中输入SELECT 0/0。只需将其放在您选择的COMMIT 之前,然后观看由此产生的烟花!

    【讨论】:

    • 谢谢!虽然我得到一个编译错误而不是运行时错误。
    【解决方案2】:

    如果您涉及到唯一密钥,您可以放置​​一个记录,这会导致重复密钥违规。

    【讨论】:

    • 谢谢!这有帮助,但不适用于上述特定情况。这将在插入阶段失败,这意味着尚未提交任何内容。即没有什么可回滚的。
    【解决方案3】:

    希望这对其他人有所帮助! 我最近发现最好的方法是通过信号。 在删除阶段的中间,我输入了一个错误信号,因此进程会在该令牌上失败并退出循环,因此它应该回滚它在插入阶段为该令牌插入的任何内容。

    DECLARE rollback_on_token_101 CONDITION FOR SQLSTATE '99001';
    

    在删除阶段的循环中间

    IF TOKEN_SUCCESS_COUNT=100 THEN
      SIGNAL rollback_on_token_101 
      SET MESSAGE_TEXT = 'rolling back on mid-delete phase on token # 101 ';
    END IF;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-01
      • 2011-11-15
      • 2011-11-24
      • 2013-05-21
      • 1970-01-01
      • 2015-02-02
      • 1970-01-01
      相关资源
      最近更新 更多