简单的回滚机制
rollback的Python项目详细描述
这是一个简单的Pythonic机制,用于以可预测的方式回滚多个操作,可用作context manager或独立实例(请参见Example usage)默认情况下,将重新引发错误,但必须提供显式模式或调用,才能触发回滚。有效模式为:
- onErrorboolean当Truewill roll back if an error is时{tt1}$boolean 凸起
- onSuccessBoolean当Truewill roll back if an error is时{tt3}$Boolean not凸起
两种模式都可以设置为True以始终回滚也可以通过调用doRollback手动触发回滚请注意,对doRollback的多次调用只调用回滚步骤一次
通过将raiseError设置为False,可以抑制错误。请注意,不管raiseError设置如何,回滚步骤中的错误都不会受到影响
如果触发回滚,则按后进先出顺序(LIFO)调用每个步骤也就是说,最近添加的步骤称为第一步,第一步称为最后一步
兼容性
使用以下版本的python测试了回滚:
- 3.7.4条
- 3.6.9
- 3.5.7
- 3.4.10
- 3.3.7条
- 2.7.16条
- 2.6.9条
安装
从源安装:
python setup.py install
从pypi安装:
pip install rollback
示例用法
from__future__importprint_functionfromrollbackimportRollback# *always* rollback after exiting block, letting any error be re-raisedwithRollback(onError=True,onSuccess=True)asrollback:print('do a1')rollback.addStep(print,'undo a1')print('do a2')rollback.addStep(print,'undo a2')# rollback *only* if *no* error is raised, letting any error be re-raisedwithRollback(onSuccess=True)asrollback:print('do b1')rollback.addStep(print,'undo b1')print('do b2')rollback.addStep(print,'undo b2')# rollback manuallywithRollback()asrollback:print('do c1')rollback.addStep(print,'undo c1')print('do c2')rollback.addStep(print,'undo c2')rollback.doRollback()# rollback *only* if an error is raised, suppressing the errorwithRollback(onError=True,raiseError=False)asrollback:print('do d1')rollback.addStep(print,'undo d1')print('do d2')rollback.addStep(print,'undo d2')raiseRuntimeError('this is not re-raised')# rollback *only* if an error is raised, letting the error be re-raisedwithRollback(onError=True)asrollback:print('do e1')rollback.addStep(print,'undo e1')print('do e2')rollback.addStep(print,'undo e2')raiseRuntimeError('this is re-raised')
产生输出:
do a1 do a2 undo a2 undo a1 do b1 do b2 undo b2 undo b1 do c1 do c2 undo c2 undo c1 do d1 do d2 undo d2 undo d1 do e1 do e2 undo e2 undo e1 Traceback (most recent call last): File "example.py", line 41, in <module> raise RuntimeError('this is re-raised') RuntimeError: this is re-raised