发帖    主题    评论    推荐    标签    作者    订阅    查搜    注册   登陆   关注
 
面向对象 设计模式 领域驱动设计 企业架构 框架 开发教程 微服务 大数据 扩展性 并发编程 事件驱动 分布式 CQRS
1 2 下一页 Go 2

事件与事务

                   
2011-11-03 19:07
赞助商链接

一直隐身看jdon的东东,很有感触,在此十分感谢 bang

疑问:

比如某个Domain对象会有自己的一个operation从而引发一个event 单事件 可以保证事务性。

如果是某个service 要用到两个Domain对象并进行相关的operation,此时如何做到多个operation的事务性。

就拿 银行转帐的例子来说

两个Account都会有自己的operation,而在转账的service中要触发每个Account的相关operation,而每个
Account都有自己的event产生,这时如何保证多个operation的事务性呢?




[该贴被admin于2011-11-03 19:41修改过]

10
2011-11-03 19:58

2011年11月03日 19:07 "@donglangjohn"的内容
这时如何保证多个operation的事务性 ...


Event Sourcing实现事务的方式是先持久后回放,将这个operation涉及的事件都持久化append到日志或数据库中,当其中一个Event失败,重新开始播放这个事件,可以设置Try几次,如果还不行通知管理员,这类似JMS的消息事务机制。

2011-11-03 20:31

每个Domain的event都是分别独立分发,这如何标识某些operation是处于一个事物中的呢, 难道要在相关的event里都分配一个flag么? 如果是这样的话,看上去有点别扭啊。

是否可以在这些operation之外再加一层----标识事务性

eventList{A_event,B_event} 如此来表明 两个operation是处于一个事务

2011-11-04 08:10

2011年11月03日 20:31 "@donglangjohn"的内容
每个Domain的event都是分别独立分发,这如何标识某些operation是处于一个事物中的 ...


主要是对传统事务的认识要改变,传统事务提出ACID,是因为这个思路假设operation内部都不是原子性等;而当前使用事件消息,本身是原子性的。

所以,如果哪个事件出错,只要回滚重放这个事件即可,与外面的operation无关。

还有一种做法是利用传统JTA+有事务机制的JMS或MQ:将这些Domain Event发到JMS的Queue中,在Queue的Consumer端完成带有Operation业务的操作,在这个operation方法中,不断读取Queue的Events,当然这个Queue一定是与operation方法方法对应,事先在JMS服务器中已经配置好;Consumer这个operation方法中使用传统的JTA事务,这样这个JTA事务将确保operation方法事务性,要么全部完成,如果有一个事件处理出错,整个全部回滚,Queue本来被读取的全部事件消息还留在Queue中,等待Consumer下一次重新执行。

2011-11-04 09:45

2011年11月04日 08:10 "@banq"的内容
主要是对传统事务的认识要改变,传统事务提出ACID,是因为这个思路假设operation内部都不是原子性等;而当前使用事件消息,本身是原子性的。 ...


我觉得对于多事件同一事务的情况,是一种类似工作流思维,是一个整体。若用不变性来处理,可以认为,前面任何一个事件都没有发生改变实体状态的操作,只是单单把计算结果交给下一个事件(击鼓传花?想到某个模式了- -),最后只在最后一个事件改变状态。

2Go 1 2 下一页

赞助商链接

赞助商链接

返回顶部

移动版 关于本站 使用帮助 联系管理员 最佳分辨率1366x768
OpenSource JIVEJDON Powered by JdonFramework Code © 2002-20 jdon.com