在Spring启动应用程序中包装事务中的多个调用?

bra*_*orm 3 spring spring-transactions spring-boot

我正在使用jdbctemplate在我的spring应用程序中对db执行查询.

这是使用@Transactional注释的方法

@Transactional
public boolean doSomething(){    
    try {
        jdbcTemplate.update(sql1); //1
        jdbcTemplate.update(sql2); //2
        jdbcTemplate.update(sql3); //3
        return true; 
    } catch (Exception ex){
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果1和2成功而3失败,1和2上的交易是否会回滚?我该怎么测试呢?

另外有一个布尔值作为返回值是一个表明交易状态的好习惯吗?

Zer*_*leb 5

没有!如果你捕获异常,你的sql将不会回滚!!!!

这不会触发回滚.你需要删除try-catch.但是,如果抛出运行时异常,这些将按预期回滚.请参考以下文档.

@Transactional设置

http://docs.spring.io/autorepo/docs/spring/4.2.x/spring-framework-reference/html/transaction.html#transaction-declarative-attransactional-settings

您会看到几行内容,任何RuntimeException都会触发回滚.因此,如果您捕获异常,它将不会触发回滚,它将在您返回false时简单地结束事务.另外请注意,如果抛出一个已检查的异常,它将不会回滚,所以不要试图通过抛出一个异常来做这个布尔返回值.

我自己没有尝试过,但是如果你在@Transactional上设置rollbackFor属性或者在这个方法的外部捕获RuntimeException,你似乎可以回滚检查异常?或抛出自己的运行时异常?我把它留给你.

如上所述,这也适用于存储库,您可以在此处查看示例

Spring Data(Repositories)事务

http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#transactions