我使用spring 3.2并有一些事务。当我遇到异常时,回滚似乎没有完成。
我的代码
public class x{
@Transactional
public createX(){
try{
...
y.createY();
...
}
catch(Exception e){
....
}
}
}
public class y{
@Transactional
public createY(){
...
callYY();
...
}
@Transactional(propagation = Propagation.REQUIRED)
public void callYY(){
...
throw new Exception();
}
}
@Configuration
@EnableTransactionManagement
public class Configuration {
}
基本上,我有一个类X,createX方法启动一个事务。它调用createY谁调用call YY。在这个方法中发生了异常。我在想,那么自createX以来的所有持久操作都将被回滚,但这不是谁发生的
我在日志中没有看到交易信息
任何想法
这很简单。在方法createX中捕获异常。若你们想回滚,你们不能捕捉事务中的异常。要回滚事务,您必须抛出异常而不捕获。
传播。REQUIRED
(默认)表示在打开的事务存在的情况下没有打开任何事务。这意味着在调用x.createX
方法时实际打开了事务,而在调用y.callY
和y.callYY
方法时没有执行任何操作(就事务处理而言)。
但是,您捕获了异常,并且它没有到达在x.createX方法上定义的Spring事务拦截器,该方法应该将其转换为回滚。
因此,如果x.createX
不必是事务性的,则从其中删除@Transactional
将使回滚发生。
尝试定义导致回滚的异常,例如:
@Transactional(rollbackFor = {Throwable.class, Exception.class})
你能告诉我如何只对某些代码块运行事务吗?我有@Transactional的服务函数,并从它们调用存储库函数,在那里执行查询。但当查询失败时,由于事务必须结束,服务功能也随之失效。那么,当存储库函数失败时,如何返回null值呢?我需要在失败时捕获空值,并继续一些逻辑。我的代码: 我尝试了@davidxxx的答案,得到了这个错误:
问题内容: 我在下面使用HIbernate和Spring和JPA。当引发PersistenceException时,我想捕获它并返回错误消息,以便它不会传播到调用者。 但是我得到一个异常,说我需要在异常之后回滚事务,但是当我捕获到异常并且不想重新抛出该异常时,如何回滚它呢? 问题答案: 似乎没有办法回退由Spring ORM管理的失败事务。问题中显示的代码是服务类。将其持久性例程提取到单独的DAO
我有一个场景如下 我的问题是,对于一个给定的流,我可能有两个请求同时调用这个方法。我希望methodC抛出乐观锁定失败和回滚事务的异常。 发生的情况如下:R1和R2调用methodA->methodB(启动一个新事务)->methodC(启动一个新事务):两个都读取相同的实体版本,都进行相同的更改并调用merge->methodC完成流回methodB->methodB完成强制事务提交->事务提交
我使用的是Spring3.0.5和Hibernate3.6。在我的项目中,有一个场景,我必须回滚在抛出的任何异常或错误发生的事务。这是示例代码,除了当我抛出异常时事务不会回滚之外,一切都很好,但是如果抛出任何异常,比如mysql.IntegrityConstraintException,那么事务会回滚,为什么在我的情况下没有发生这种情况? hibernate.cfg 因此,正如我所说,我的问题是,
-ZJ 以下是我在Application.Properties中的数据源设置:
非常感谢