Seam的事务管理

Seam的事务管理

Seam和jsf绑定在一起,seam将jsf的6个阶段包含在2-3个事务中。

1. 第一(二)阶段到第5阶段:
a) 对于JTA事务而言:beforeRestoreView------afterInvokeApplication
b) 对于resouce-Local事务而言:beforeApplyRequestValue------ afterInvokeApplication
2. 如果有page Action,则page Action包含在一个事务中
3. RenderResponse包含在一个事务中

为什么要使用2-3事务来保障一个request,而不是像ssh通常的那样,简单的在crud方法上加上事务呢?
对于1,2而言,主要原因是:防止由于renderresponse的异常,导致已经成功的业务逻辑回滚;同时,如果业务逻辑失败,可以回滚并且导航到其他的页面进行显示。
对于3而言,可能是因为seam认为,当绑定在页面的实体有延迟加载的需求时,如果不是在renderResponese阶段最外层显示的包裹一层事务,那么每次延迟加载引起的数据库查询,hibernate都会单独为这个查询启动和关闭一个事务,这会消耗更多的资源。


Seam提供了这种自动为每个request加上事务的功能,你可以选择将这个功能开启或者关闭。在component.xml中配置:
<core:init transaction-management-enabled=”false”/>
可以关闭seam的全局托管事务的功能。

如果你开启了seam的全局托管事务功能,你可以指定seam使用何种的事务管理器:
UTTransaction
CMTTransaction
EntityTransaction
HibernateTransaction
noTransaction

UTTransaction是seam默认的事务管理器,他会从Context中寻找“UserTransaction”。
CMTTransaction默认的ejb事务管理器,例如调用一个slsb的方法,该方法加了request_new事务,则这个事务由CMTTransaction管理。
如果你只使用一个resouce-local的数据源,不需要JTA事务的支持。那么对于一个resouce-local的数据源,采用JPA的EntityTransaction或者hibernate的hibernateTransaction即可。配置
<tx:entity-transaction/>使用EntityTransaction作为事务管理器
或者
<tx:hibernate-transaxtion/>使用hibernateTransaction作为事务管理器

这些事务管理器都是由seam提供的,他们都实现了seam的UserTransaction接口,只不过实现的方式有所不同。例如,Begin方法:
EntityTransaction通过调用entitymanager.gettransaction.begin实现。
hibernateTransaction通过调用session.gettransaction.begin实现。

根据自己的需要选择适合的事务管理器。
如果使用<tx:no-Transaction/>则一定要关闭seam全局托管事务,否则会seam调用Transaction.instance的方法时,会报异常。
===================================

JTATransaction与JdbcTransaction的区别

JdbcTransaction的使用流程是:
先打开session,再打开trans;最后关闭trans,关闭session。

JTATransaction的使用流程是:
先打开JTATrans,再打开各个session,关闭session,最后关闭JTATrans。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值