谁能告诉我在@Transactional 方法中捕获SQL 和其他异常是否安全并被推荐?当使用程序化事务管理时,我可以简单地捕获异常并做任何我想做的事情,但我不知道我是否不会通过捕获这些异常来破坏事务性 AOP 系统,否则这些异常会触发回滚......如果我以声明的方式进行。
我想有代理可以为 AOP 建议中的 @Transactional 方法创建一个具有单独连接的逻辑事务。他们需要捕获“我想捕获”的异常并将事务回滚。
谁能告诉我在@Transactional 方法中捕获SQL 和其他异常是否安全并被推荐?当使用程序化事务管理时,我可以简单地捕获异常并做任何我想做的事情,但我不知道我是否不会通过捕获这些异常来破坏事务性 AOP 系统,否则这些异常会触发回滚......如果我以声明的方式进行。
我想有代理可以为 AOP 建议中的 @Transactional 方法创建一个具有单独连接的逻辑事务。他们需要捕获“我想捕获”的异常并将事务回滚。
您可以使用此代码以编程方式将事务标记为仅回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
请参阅Spring Reference中的回滚声明性事务。
但不建议这样做,因为您将代码紧密耦合到 spring 框架。
也许,如果你在多个地方这样做,你应该引入一个辅助方法,比如TransactionUtils.rollbackCurrentTransaction()
. 这样,如果你决定改变你的事务方法(或者上帝禁止,远离 spring),你只需要改变一种方法。
您描述的确实是Spring如何知道是否启动事务回滚。如果您吞下异常,那么 Spring 永远没有机会知道它应该回滚事务。