2010-07-15 81 views
1

这个特定的所存储过程确实存档吹扫:
1)从交易分贝
2)把令牌在临时表
3)循环通过令牌选择标记:使用从临时表令牌
3.1),检索数据事务表和插入到单独归档数据库中的表(通过联合)
3.2)COMMIT插入。
3.3)然后使用相同的令牌从事务中删除数据
3.4)COMMIT删除。如何测试存储过程的两阶段提交行为?


2阶段提交允许我们只有一个承诺在循环

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

回答

0

强制运行时错误,我通常在代码中放入一个SELECT 0/0。只需将它放在您选择的COMMIT之前,然后观看结果产生的烟花!

+0

里面的感谢!虽然我得到一个编译错误,而不是运行时错误。 – javacruiser 2010-07-23 04:36:58

0

如果你有独特的密钥参与,你可以放置一个会导致重复密钥提交的记录。

+0

谢谢!这有助于但不是针对上述特定情况。这将在插入阶段失败,这意味着还没有任何承诺。即没有回滚。 – javacruiser 2010-07-23 04:46:13

0

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

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;