可以请任何人告诉我如果它是安全的并且建议在@Transactional方法中捕获SQL和其他异常吗?当使用程序化事务管理时,我可以简单地捕获异常并做我想做的任何事情,但我不知道我是否通过捕获这些异常会破坏事务AOP系统,否则会触发回滚...如果我以声明的方式做。
我认为有代理,它们在AOP建议中为@Transactional方法创建一个单独连接的逻辑事务。他们需要捕获“我想抓住”的异常并将事务回滚。
答案 0 :(得分:1)
您可以使用此代码
以编程方式将事务标记为仅回滚TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
请参阅Rolling back a declarative transaction中的Spring Reference。
但不建议这样做,因为您将代码紧密地耦合到spring框架。
也许,如果你在不止一个地方这样做,你应该引入一个帮助方法,比如TransactionUtils.rollbackCurrentTransaction()
。这样,如果你决定改变你的交易方法(或上帝保佑,远离春天),你只需要改变一种方法。
答案 1 :(得分:0)
您所描述的确实是Spring如何知道是否启动事务回滚。如果吞下异常,那么Spring永远不会知道它应该回滚事务。