@Transactional 仅针对少数例外传播事务

Posted

技术标签:

【中文标题】@Transactional 仅针对少数例外传播事务【英文标题】:@Transactional propogate transactions only for a few exceptions 【发布时间】:2013-09-12 02:27:04 【问题描述】:

我正在尝试使所有未经检查的异常的事务失败,但特定的未经检查的异常除外(在我的情况下 - DuplicateKeyException)。如何使用 Spring 框架的 @Transactional 注释实现这种定制?

谢谢!

【问题讨论】:

那么当 DuplicateKeyException 发生时,您期望会发生什么?您对交易“未失败”的定义是什么? 我捕获了 DuplicateKeyException 异常并继续交易。如果设置 @Transactional(propogation=Propogation.NEVER) 一切都按我的预期进行,否则它会给我以下错误消息:org.springframework.jdbc.core.StatementCreatorUtils - JDBC 3.0 getParameterType call not supported org.postgresql.util.PSQLException: ERROR : 当前事务被中止,命令被忽略直到事务块结束 【参考方案1】:

试试noRollbackFor 选项

@Transactional(noRollbackFor=DuplicateKeyException.class)

【讨论】:

我试过这个,但它给出了同样的错误。问题似乎是事务失败,这告诉事务管理器应该对失败的事务执行什么回滚操作【参考方案2】:

这样做:

public void driverMethod()
try
   BeforeException()

catch(DuplicateKeyException e)
   AfterException()


@Transactional(propagation = Propagation.REQUIRES_NEW)
private BeforeException()


@Transactional(propagation = Propagation.REQUIRES_NEW)
private AfterException()

【讨论】:

以上是关于@Transactional 仅针对少数例外传播事务的主要内容,如果未能解决你的问题,请参考以下文章

@Transactional(传播=传播。需要)

Spring @Transactional 只读传播

@Transactional 在私有方法上的传播

@Transactional 的“REQUIRES_NEW”传播属性的真实世界用例是啥

Spring @Transactional 隔离传播

Spring声明式事务@Transactional 详解,事务隔离级别和传播行为