站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2EE 专题J2EE容器管理的事务,session bean和entity bean在事务更新时发生延时的问题!

J2EE容器管理的事务,session bean和entity bean在事务更新时发生延时的问题!

摘要: J2EE容器管理的事务,session bean和entity bean在事务更新时发生延时的问题!


问题描述:
====================================
表XX(有约束条件,start_date必须唯一)

start_date
-----------
2006-07-01
2006-07-02
2006-07-03

现在有一个session bean负责来更新表XX的数据,其中有两个方法:
public boolean B(String[] xx){...}和public String A(String x){...}。
它们都里事务独立的。

方法B把String[]数组里的数据,遍历传给A方法去更新数据库。

方法A是按下面方式处理数据的:
首先根据传入的x去查询表XX,如果没有发现有相同start_date时,insert表。否则update表中的其它值。

==================================================
出现的问题:
当数组xx里的数据是:2006-08-01,2006-08-01
执行时发生了两笔数据都回滚了,没有把2006-08-01插入表中。
本人分析:
1、按理说方法A和B都是事务独立的,两个事务是不会互相影响的。
2、从现象上看是,当A第一次更新2006-08-01时,发现表里没有,insert了数据。当离开方法A时,事务提交了,现在由容器才去真正更新数据库,“更新是需要时间的”。
3、这时由于方法B遍历数据来调用方法A的原因,第二笔数据2006-08-01又来了,方法A去查询表XX,因为由于前一笔数据还未反映到表XX中,则返回在表A中没有找到2006-08-01数据,执行逻辑把第二笔2006-08-01数据,insert到表XX中。
4、因为表XX中有约束条件,所以发生异常,导致回滚。
5、insert,update都是用entity bean完成的。
===================================================
如何才能解决上面的问题呢?如果才能知道前一个事务已经完成了呢?


帮顶


谢了。有分。


哈哈哈!!!!
问题解决了。原来是这两个方法的事务引起的问题。
1、(ejb-jar.xml)原来这两个方法的事务是<trans-attribute>RequiresNew</trans-attribute>的。
2、现在我把B方法的事务改成了<trans-attribute>NotSupported</trans-attribute>的。
3、因为在B方法里没有使用事务的必要,因为它与数据库无联系。
4、这样以来,方法B的事务就不会影响方法A了。
===========================================
在session bean中事务有下列几种:
a)NotSupported
b)Supports
c)Required
d)RequiresNew
e)Mandatory
f)Never
现在问题已经解决了,请大家讨论一下这几个事务具体的范围是什么?就当散分了,讨论者有分!!谢谢,相互学习。


你的问题虽然解决了,但是你的理解不太正确。
应该是由于事务嵌套引起的,B的事务是外层事务,A的是内层事务,发生异常时,整个B事务都发生了回滚。



楼上的说的很对,是嵌套事务。
但是<trans-attribute>RequiresNew</trans-attribute>为什么为使两个独立的public方法产生嵌套事务呢?


顶。


呵呵,在网上找到一部分,先来分享一下:
Required 事务类型指明会话 bean 方法在代码执行时需要存在一个事务。如果不存在,则容器提供一个事务。如果在调用线程中已经存在一个事务,则使用该事务。
RequiresNew 事务类型不同。如果在调用线程中不存在事务,则由容器创建一个事务,与 Required 事务类型相似。然而,如果调用线程已经存在一个事务,则将此事务挂起,并创建和使用一个新事务。然后再恢复并继续运行调用事务。


1、Required:当客户端运行一个事务处理并调用EJB的一个方法,这个方法执行客户端的事务处理;当客户端没有启动一个事务处理,则EJB容器在执行这个方法之前启动一个新的事务处理.

2、RequiresNew:当客户端运行一个事务处理并调用EJB的一个方法时,容器管理器做如下操作:
(1) 悬挂客户端的事务处理;
(2) 开始一个新的事务处理;
(3) 调用方法;
(4) 当方法结束,恢复客户端的事物处理.
当客户端没有启动一个事务处理,容器管理器在执行这个方法之前启动一个新的事务处理.
3、Mandatory: 当客户端运行一个事务处理并调用EJB的一个方法,这个方法在客户端的事务处理范围内被执行; 当客户端没有启动一个事务处理,容器管理器将会抛错(TransactionRequiredException);
4、NotSupported: 当客户端运行一个事务处理并调用EJB的一个方法,容器管理器在调用方法之前终止客户端的事务处理,当方法执行完,再恢复客户端的事务处理; 当客户端没有启动一个事务处理,容器管理器在调用方法时不启动事务处理.
5、Supports: 当客户端运行一个事务处理并调用EJB的一个方法,在运行方法时执行客户端的事务处理; 当客户端没有启动一个事务处理,容器管理器在调用方法时不启动事务处理.
6、Never: 当客户端运行一个事务处理并调用EJB的一个方法,容器管理器将抛出一个错误(RemoteException); 当客户端没有启动一个事务处理,容器管理器在调用方法时不启动事务处理.


↑返回目录
前一篇: 同一网段内的两台机器为什么有一台不能PING另外一台
后一篇: 600分!JMS选型,请教ActiveMQ的问题!