软件开发者面试百问-----是否了解什么是无状态的业务层?长事务如何与之相适应?

先解释一下两个概念:
1.无状态的业务层(stateless business layer)
简单点讲就是业务对象是没有状态的,不会共享自己的状态,比如上一次调用的时候的状态。
常见的例子:EJB的Stateless session bean, Spring的bean的singleton也是这样的。
无状态的业务对象可以减少对共享资源使用的冲突,从而提高效率。而且可以降低更容器的耦合。
因为有状态的业务对象是需要容器来维护的。当然如果使用无状态的业务对象,
我们需要自己维护一些状态,如果我们的业务层对象如果被频繁访问,而且访问之间会被共享信息,
这个时候应该使用有状态的业务对象。


2.长事务(long-runing transaction)
长时间运行事务(L-R事务)不是标准的ACID(atomic, consistent, isolated and durable)的事务。
因为通常这样的工作单元将耗费很长的时间,这里的很长可能几秒钟到几天、几个月,甚至几年。
ACID事务之所以不适合这种情况是因为,ACID事务在事务期间锁定访问的数据,并要求并发的事务串行化,
而长L-R事务的运行时间很长,不可能在很长的时间内一直锁着数据。而且L-R事务通常涉及到多个数据库
和多个系统,其内部的活动也有很大程度的不确定性。举一个简单的例子:我们上网买书,
下订单之后网站那边开始出货(这中间应该有些自己的操作),然后准备送货,这个时候用户想取消订单,
那么这个时候网站就需要回滚已经做完的操作,甚至更加麻烦的情况,
后来客户又要恢复这个订单,这个时候被回滚操作需要重新执行。
这里边的每个操作,比如下订单,准备货物之类的相当于一个小的事务,整个买书的过程相当于一个长事务。

关于长事务的文章很多:
http://cgi.di.uoa.gr/~ad/MDE519.DOCS/LongRunningXactions.pdf
http://geekswithblogs.net/cyoung/articles/100424.aspx
上面这篇文章的中文版:http://blog.csdn.net/chnking/archive/2007/09/28/1804932.aspx
http://www.ict.csiro.au/staff/Julian.Jang/EDOC2003.pdf

长事务如何与无状态业务层相适应?
如果采用事务补偿模型(The Compensation Model )来处理长事务,那么肯定要将workflow的每个状态持久化,否则无法回滚,
也就是需要将无状态的业务对象持久化。
这里提到的回滚包括正向和逆向的回滚。
其他模型肯定也是类似的做法。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值