简单的回滚机制

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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
javai是JAXB的新手。如何将两个具有不同名称空间的不同xml合并为一个具有根元素的xml并将其解组?   JDO中的java应该是可传递的DefaultFetchGroup吗   java服务器配置问题   java在理解JList时遇到困难   java何时将RequestContextFilter用于Jersey?   java从数据库中读取文本文件。jar文件   Java正则表达式,仅适用于不包括零的正数   爪哇番石榴。类路径中的jar   JavaEE:关于设计的问题   java GUI,在面板中排列按钮   java Android为什么使用接口被认为是活动和片段之间通信的最佳实践?   java如何获取wicket图像的url以在开放图元标记中使用它   从Java字节[]>Base64>Javascript数组缓冲>Base64>byte[]   java正则表达式帮助字符串JWE766。1.pdf格式摘录766   java Hibernate,JPA忽略@Formula