EJB Transaction没有自动commit

zenghuiss 2010-11-12 11:45:47
使用EJB的时候遇到一个问题,因为系统比较老 用得的都是xml配置的
有两张表:A,B
是原本的想法是A中的a字段update后,B表中的b字段根据A中更新a字段的数据做update
但是执行此方法 2个update好像是同时发出,所以B中的字段没有upadte 只有A的会变化

代码大致如下:
public class Impl{
void update(xx){
DetailDao.updateA(xx);
DetailDao.updateB(xx);
}
}

public class DetailDao {
static void updateA(xx){
CommonDao.update(xx);
}
static void updateB(xx){
CommonDao.update(xx);
}
}

public class CommonDao{
//实际的sql
.....
}

ejb-jar.xml配置如下
<session>
<display-name>Impl</display-name>
<ejb-name>Impl</ejb-name>
<home>com.xx.ImplHome</home>
<remote>com.xx.ImplRemote</remote>
<ejb-class>com.xx.Impl</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
请大家帮帮忙
谢谢~
...全文
79 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zenghuiss 2010-11-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 crazylaa 的回复:]
可能是你的DAO中采用了连接池,在这里DAO两个方法使用了两个不同的连接。
而在oracle中,如果第一个会话(体现在这里就是第一个连接)不commit的话,其他会话(在这里就是第二个连接)是看不到它的更新的。
其他数据库是什么样子的我不知道。

所以,如果你要实现这样的事务,就得保证你的DAO里面,两个方法使用的是同一个连接会话(中间不能有connection.close把连接放回连接池……
[/Quote]
谢谢回复
好像你理解有些偏差···我本意是想让它成为2个事务,这样第一次做的update 才能为第二次做的可见
我想的是 我的配置有问题 只让Impl里面的method让容器管理
而Dao里面的并没有 但实际上做update是由Dao里面的method来控制
第一次update,此时还未提交 第二次update的时候看到的是脏数据
致使数据不一致
个人猜想···还望指正
crazylaa 2010-11-12
  • 打赏
  • 举报
回复
可能是你的DAO中采用了连接池,在这里DAO两个方法使用了两个不同的连接。
而在oracle中,如果第一个会话(体现在这里就是第一个连接)不commit的话,其他会话(在这里就是第二个连接)是看不到它的更新的。
其他数据库是什么样子的我不知道。

所以,如果你要实现这样的事务,就得保证你的DAO里面,两个方法使用的是同一个连接会话(中间不能有connection.close把连接放回连接池)。我看你这里是两个dao中的方法,所以才如此猜想。。。
zenghuiss 2010-11-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 qingkangxu 的回复:]
貌似不是commit不commit的问题吧,是不是你DetailDao.updateB里面的逻辑判断导致数据库本身就没有被更新。

不惯怎么着,容器管理的事务应该是没问题的。看看你里面的逻辑判断 是不是不满足更新的条件。
[/Quote]
谢谢你的回复,第一次updateA是有成功,而第二次updateB失败
所以我把log里面的sql贴出来跑的话,
如果不执行完一条commit一次 也会出现我所述的情况,
但执行第一条,commit,再执行第二条 就正常了,
因此我才会往CMT的commit的方向猜,
其实修改一下可以解决 因为原来的逻辑分析一下本来就欠妥···
同一个method里面 不应该让另一个update的结果依赖于上面的update的结果。。。
我只是比较好奇这个问题,希望能搞明白~
qingkangxu 2010-11-12
  • 打赏
  • 举报
回复
貌似不是commit不commit的问题吧,是不是你DetailDao.updateB里面的逻辑判断导致数据库本身就没有被更新。

不惯怎么着,容器管理的事务应该是没问题的。看看你里面的逻辑判断 是不是不满足更新的条件。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧