我对这个问题有点恼怒.让我们检查是否有人实现了类似的东西.
我有一个带有8个WS的java 8 Web应用程序.一些这样的WS,通过JDBCTemplate进行插入和更新(由于性能需要,Hibernate不是一个选择),如果执行因异常而崩溃,我需要它们回滚.
我在spring app上下文文件中有以下数据源和事务管理器配置(Tomcat的server.xml / context.xml中的jndi资源):
diobjectfactorybean">
另一方面,我有一个dataBase DBcontroller.class的唯一访问点,它有一个插入,删除和更新的通用方法:
private NamedParameterJdbcTemplate jdbcTemplate;
private DataSource datasource;
@Autowired
public void setDataSource(DataSource dataSource) {
this.datasource = dataSource;
this.jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
}
@Override
public boolean queryForModifying(String query,sqlParameterSource parameters) {
int modifiedRows= 0;
try {
modifiedRows= this.jdbcTemplate.update(query,parameters);
} catch (Exception e) {
e.printStackTrace();
numRegistrosAfectados = 0;
}
return (modifiedRows> 0) ? true : false;
}
最后我有一个WS接口这样:
@WebService
public interface IService{
@WebMethod
public method(MethodRequestType request) throws IllegalArgumentException,IllegalAccessException;
}
实施:
@WebService(endpointInterface = "com.package.IService")
@HandlerChain(file = "handler-chain.xml")
public class Service implements IService{
@Autowired
IDBController dbController;
使用“交易”方法:
@Transactional
private boolean inserts(HashMap
它应该在非WS项目上正常工作,但正如我发现没有那么简单的方法来完成这项工作.
首先我认为它没有回滚,但现在我很确定它不会创建交易.
stackoverflow中有一些类似的帖子,但没有一个能解决我的问题.我已经谷歌了很多,建议的唯一方法是WS-AtomicTransactions,我从未听说过.
我已经尝试了几乎所有的XML配置文件,我甚至尝试以编程方式管理事务,但由于它是一个连接池,我无法将自动提交设置为false,因此我可以强制回滚.
因为如果它对任何人都有用,我为每个WS实现了肥皂处理程序,看起来像这样:
public class ServiceHandler implements SOAPHandler
最佳答案
重要的是你调用@Transactional注释的方法.例如,如果你有:
@Service
public class Service1 {
@Transactional
public void method1() { ... }
public void method2() {
method1();
}
}
@Service
public class Service2 {
@Autowired
private Service1 service1;
public void method1() {
service1.method1();
}
public void method2() {
service1.method2();
}
}
>调用service2.method2()不会创建事务.
>调用service2.method1()将创建一个.
由于Spring处理Proxies和AOP的方式.