[SessionBean]简单又鲜为人知的问题!

king0000ps 2005-12-22 09:54:02
随手创建个SessionBean, 声明一个方法(Transaction为Required, CMP), 在这个方法里直接两条sql(比如说两条一样的insert语句), 第一条执行成功,第二条报Exception, 在该方法catch段中throw这个Exception, 请问大家,第一条sql是commit还是rollback? 为什么??

方法的结构如下:
public void test()throws RemoteException,Exception{
try{
getConnection ...

execute sql1;

execute sql2;

}
catch(Exception ex){
System.out.println(ex.toString());
throws ex;
}
}

...全文
256 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lanserzhao 2006-01-02
  • 打赏
  • 举报
回复
spring+hibernate+struts技术论坛群9967568,真诚欢迎各位喜好的朋友来学习论坛
DanielYWoo 2006-01-02
  • 打赏
  • 举报
回复
<transaction-type>Container</transaction-type>
这行表示事物界定由容器决定,Container Managed Transaction,如果你的session bean有数据库/JMS/JCA事物,那么事物的边界和提交回滚控制是容器自动完成,你只需要用setRollbackOnly或者EJBException来通知容器回滚.
CMP和CMT两码事,CMP是定义持久化的,只有entity bean才有这个概念, 你对CMT/BMT/CMP/BMP的概念还需要更清楚一下。
EJB CMT之所以和.NET web service transaction处理方式不同是因为EJB要留给用户更多的灵活控制的能力,考虑起来是要复杂繁琐的多,这没办法,你看看容器生成session bean,.NET设计师是Anders,他有Delphi情怀,运行平台是Windows, 所以.net当然是偏RAD风格的,Java这边都是SUN IBM Oracle阵营的,设计更高考虑架构分层负载方面,学习实施起来肯定要慢的。

king0000ps 2005-12-30
  • 打赏
  • 举报
回复
<session>
<description>Session Bean ( Stateless )</description>
<display-name>AdapterEJB</display-name>
<ejb-name>AdapterEJB</ejb-name>
<home>tw.com.synergy.ehs.ejb.AdapterEJBHome</home>
<remote>tw.com.synergy.ehs.ejb.AdapterEJB</remote>
<ejb-class>tw.com.synergy.ehs.ejb.AdapterEJBBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>

现在我比较倾向你所说的,SessionBean根本没有CMP这一说;
不过你看我给出的ejb-jar.xml,里面的的确确有这么一行:
<transaction-type>Container</transaction-type>
这样说的话,这行写不写都一样了....

sun公司的SessionBean例子都有这行。

我提这个问题是因为:
我用过.Net的Http WebService,也可以设置TransactionType,如果设置为Required,每当一个方法中的exception不能在本层中处理并抛出时,那么这个方法中的sql操作全部rollback。 所以我就想当然的,以为SessionBean应该和.Net的WebService差不多。 只要一个方法中exception为处理并抛出,那么这个方法中的所有sql都rollback,谁知.... 我只能评价:so weak, so unfriendly。
DanielYWoo 2005-12-28
  • 打赏
  • 举报
回复
SessionBean不是持久对象本来就没有CMP这一说,我猜你说的是CMT

如果你确定你的connection是从容器获得的,而且两个操作用的同一个connection,只能怀疑你的数据库不支持事物(比如Access)或者你的ejb部署的不对
king0000ps 2005-12-27
  • 打赏
  • 举报
回复
我的connection是这样得到的:
public static Connection getConnection(String ejbJdbcLocation)throws Exception{
Context ic = new InitialContext();
DataSource ds = (DataSource) ic.lookup(ejbJdbcLocation);
return ds.getConnection();
}

从容器中get的....
另外在sun 的j2ee tutorial上,对CMP的SessionBean怎样控制transaction的,只字未提。
对CMP的EntityBean倒是提到了。
DanielYWoo 2005-12-23
  • 打赏
  • 举报
回复
catch(Exception ex){
System.out.println(ex.toString());
this.context.setRollbackOnly();
}
或者
catch(Exception ex){
System.out.println(ex.toString());
throws new EJBException("test");
}
都行

另外,你的connection怎么拿的?是从容器lookup的么?
bluesky35 2005-12-23
  • 打赏
  • 举报
回复
public void test()throws RemoteException,Exception{
try{
getConnection ...

execute sql1;

execute sql2;

}
catch(EJBException ex){
System.out.println(ex.toString());
this.context.setRollbackOnly();
throws ex; }
}

试试行不行.
king0000ps 2005-12-22
  • 打赏
  • 举报
回复
楼上的朋友,您的答案不是我想要的...
我上来已经说明了,是SessionBean, Transaction为Required,CMP 。
不是用UserTransaction。
masse 2005-12-22
  • 打赏
  • 举报
回复
一个事务就rollback吧
如果不是一个事务就commit了
挑大梁 2005-12-22
  • 打赏
  • 举报
回复
要看你有没有用到事务
king0000ps 2005-12-22
  • 打赏
  • 举报
回复
我现在就是碰到这个问题,为什么第一句sql就是不rollback,而且在CMP的SessionBean 中是不能再声明UserTransaction来控制transaction的,会报错,郁闷啊郁闷.....
king0000ps 2005-12-22
  • 打赏
  • 举报
回复
楼上的朋友,我按照你说的两个方法改了所写的SessionBean,但是....结果还是commit了,
修改后方法如下:

public void test()throws RemoteException,Exception{
try{
getConnection ...

execute sql1;

execute sql2;

}
catch(Exception ex){
System.out.println(ex.toString());
this.context.setRollbackOnly();
throws new EJBException("test");
}
}
DanielYWoo 2005-12-22
  • 打赏
  • 举报
回复
commit

因为对于CMP session bean你必须通过setRollbackOnly()或者EJBException莱通知容器rollback
Exception不行的,抛EJBException看看

67,512

社区成员

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

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