一个事务就rollback吧
如果不是一个事务就commit了
如果不是一个事务就commit了
解决方案 »
- hibernate中一级缓存和二级缓存的具体区别是什么?
- 是一个Action中用多个方法好呢,还是多个Action,每个Action中少用几个方法好呢
- 发点关于猎头公司的一些内幕,希望大家不要上当
- 为何IE中显示不出来JDOM解析XML后生成的树?
- Bean的问题,困了我一天,还没有解决,请帮忙!!!
- 怎么样在Jtable表格作任意一个格里加JButton按扭?求救
- 对Log4j比较熟悉的朋友,能不能指导一下这个功能如何实现?
- SQL熟练者看过来-----在线等回复
- 请问能不能java速成然后去应聘
- 关于SpringCloud搭建云平台的一些疑惑
- 我想系统学习 J2EE 技术,请问各味大虾,有什么好的顺序么?
- 欢迎有志之士加入JAVA技术群.........
我上来已经说明了,是SessionBean, Transaction为Required,CMP 。
不是用UserTransaction。
Exception不行的,抛EJBException看看
修改后方法如下: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");
}
}
try{
getConnection ...
execute sql1; execute sql2; }
catch(EJBException ex){
System.out.println(ex.toString());
this.context.setRollbackOnly();
throws ex; }
}试试行不行.
System.out.println(ex.toString());
this.context.setRollbackOnly();
}
或者
catch(Exception ex){
System.out.println(ex.toString());
throws new EJBException("test");
}
都行
另外,你的connection怎么拿的?是从容器lookup的么?
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倒是提到了。
<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。
这行表示事物界定由容器决定,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阵营的,设计更高考虑架构分层负载方面,学习实施起来肯定要慢的。