创建一系列依赖操作,并在其中一个操作失败时回滚所有操作

saga_p的Python项目详细描述


创建一系列依赖操作,并在其中一个操作失败时回滚所有操作。

安装

$ pip install saga_py

用法

简单示例

fromsagaimportSagaBuildercounter1=0counter2=0defincr_counter1(amount):globalcounter1counter1+=amountdefincr_counter2(amount):globalcounter2counter2+=amountdefdecr_counter1(amount):globalcounter1counter1-=amountdefdecr_counter2(amount):globalcounter2counter2-=amountSagaBuilder \
    .create() \
    .action(lambda:incr_counter1(15),lambda:decr_counter1(15)) \
    .action(lambda:incr_counter2(1),lambda:decr_counter2(1)) \
    .action() \
    .build() \
    .execute()# if every action succeeds, the effects of all actions are appliedprint(counter1)# 15print(counter2)# 1

操作失败示例

如果一个操作失败,将运行对所有已执行操作的补偿,并引发一个sagaerror来包装 运行期间遇到的所有异常。

fromsagaimportSagaBuilder,SagaErrorcounter1=0counter2=0defincr_counter1(amount):globalcounter1counter1+=amountdefincr_counter2(amount):globalcounter2counter2+=amountraiseBaseException('some error happened')defdecr_counter1(amount):globalcounter1counter1-=amountdefdecr_counter2(amount):globalcounter2counter2-=amounttry:SagaBuilder \
        .create() \
        .action(lambda:incr_counter1(15),lambda:decr_counter1(15)) \
        .action(lambda:incr_counter2(1),lambda:decr_counter2(1)) \
        .action() \
        .build() \
        .execute()exceptSagaErrorase:print(e)# wraps the BaseException('some error happened')print(counter1)# 0print(counter2)# 0

动作和补偿失败示例

因为action2的补偿失败了,所以从框架的角度来看补偿效果是不确定的, 所有其他补偿都不考虑。

fromsagaimportSagaBuilder,SagaErrorcounter1=0counter2=0defincr_counter1(amount):globalcounter1counter1+=amountdefincr_counter2(amount):globalcounter2counter2+=amountraiseBaseException('some error happened')defdecr_counter1(amount):globalcounter1counter1-=amountdefdecr_counter2(amount):globalcounter2raiseBaseException('compensation also fails')try:SagaBuilder \
        .create() \
        .action(lambda:incr_counter1(15),lambda:decr_counter1(15)) \
        .action(lambda:incr_counter2(1),lambda:decr_counter2(1)) \
        .action() \
        .build() \
        .execute()exceptSagaErrorase:print(e)#print(counter1)# 0print(counter2)# 1

将值从一个操作传递到下一个操作

操作可以返回返回值的dict。 然后,dict作为关键字参数传递给下一个操作,并得到相应的补偿。 补偿之间不能传递任何值。

fromsagaimportSagaBuilder,SagaErrorcounter1=0counter2=0defincr_counter1(amount):globalcounter1counter1+=amountreturn{'counter1_value':counter1}defincr_counter2(counter1_value):globalcounter2counter2+=amountdefdecr_counter1(amount):globalcounter1counter1-=amountdefdecr_counter2(counter1_value):globalcounter2counter2-=amountSagaBuilder \
    .create() \
    .action(lambda:incr_counter1(15),lambda:decr_counter1(15)) \
    .action(incr_counter2,decr_counter2) \
    .action() \
    .build() \
    .execute()print(counter1)# 15print(counter2)# 15

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

推荐PyPI第三方库


热门话题
java Cassandra复制因子大于节点数   java J2EE JTA事务回滚不适用于OSE Glassfish 4.0(Build 89)   java spring安全预认证用户登录   org的java类文件。反应流。从RxJava编译示例时未找到Publisher?   java在使用dataFormat作为POJO通过Camel调用Web服务时无法设置SOAP标头   Javafx类的java静态实例   java如何防止一个部件在关闭时覆盖另一个部件的位置   sql server无法从我的java代码连接到数据库   java在JList(Swing)中显示带有的ArrayList   从Java中的CXF服务获取WSAddressing数据   使用资产文件夹进行java简单json解析(本地)   java LDAPException未绑定的无效凭据   JavaJSFspring部署到weblogic   JAVA中字符数组中的特定元素排列?   如果脚本位于不同的目录中,则ant不会使用exec标记运行Javashell脚本