项目改用Spring Data JDBC 并手动配置DataSource之后,@Transactional注解一直不起作用。这两天研究了一下,注解不起作用,主要是没有配置 TransactionManager 的事,配置完 TransactionManager 之后,@Transactional注解就起作用了。
但是配置完又发现,用jdbcTemplate.queryForList()方法实行SQL代码时,可以或许在遇到RAISERROR()的时候回滚,但用jdbcTemplate.update()/execute()方法时,却不能。
搜索了一阵,大概总结一下就是,queryForList()被计划为取得一个ResultSet,如果遇到RAISERROR(),那么方法会抛出非常,然后Spring看到这个unchecked exception(RuntimeException),就会回滚数据。
而execute()更通用,而且并不期望获得一个 ResultSet,遇到RAISERROR() 的时候,不需要立刻抛出非常,特殊是在已经乐成实行某些代码之后了。Spring没看到有非常,也就不需要回滚数据。
那么,如何在利用execute()方法,同时遇到RAISERROR()时,让数据也能回滚呢?尝试了一下一篇问答里提到的一种方法,就是在SQL语句开头中添加SET NOCOUNT ON; 就可以了,想想原来是跟之前操作返回多数据集一个做法。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |