您的位置:首页 > 职场人生

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

2009-11-04 15:02 656 查看
先解释一下两个概念:

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的每个状态持久化,否则无法回滚,

也就是需要将无状态的业务对象持久化。

这里提到的回滚包括正向和逆向的回滚。

其他模型肯定也是类似的做法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: