先解释一下两个概念:
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的每个状态持久化,否则无法回滚,
也就是需要将无状态的业务对象持久化。
这里提到的回滚包括正向和逆向的回滚。
其他模型肯定也是类似的做法。