软件开发者面试百问-----是否了解什么是无状态的业务层?长事务如何与之相适应?
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的每个状态持久化,否则无法回滚,
也就是需要将无状态的业务对象持久化。
这里提到的回滚包括正向和逆向的回滚。
其他模型肯定也是类似的做法。
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的每个状态持久化,否则无法回滚,
也就是需要将无状态的业务对象持久化。
这里提到的回滚包括正向和逆向的回滚。
其他模型肯定也是类似的做法。
相关文章推荐
- 软件开发者面试百问-----你愿意用什么类型的语言来编写复杂的算法?
- 软件开发者面试百问-----队列和堆栈区别是什么?
- 软件开发者面试百问-----看别人代码的时候,你最关心什么地方?
- 软件开发者面试百问-----在N层架构中都有哪些层?它们各自的职责是什么?
- 软件开发者面试百问-----用堆或者栈存储数据的区别是什么?
- 软件开发者面试百问-----解释一下什么是测试驱动开发,举出极限编程中的一些原则
- 软件开发者面试百问-----不管是书、杂志还是网络,你从中所学到的最后一点算法知识是什么?
- 软件开发者面试百问-----你知道设计模式吗?你用过哪些设计模式?在什么场合下用的?
- 软件开发者面试百问-----什么是低耦合和高聚合?封装原则又是什么意思?
- 软件开发者面试百问
- 软件开发者面试百问(ZT)
- 软件开发者面试百问
- 软件开发者面试百问
- 软件开发者面试百问-----怎样把字符串反转?你能不用临时的字符串么?
- 转贴:软件开发者面试百问
- [转]开发者面试百问-软件项目管理部分答案
- 软件开发者面试百问-----描述一下实现一段代码的过程,从需求到最终交付
- 软件开发者面试百问
- 软件开发者面试百问
- 软件开发者面试百问(转)