项目改用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; 就可以了,想想原来是跟之前操作返回多数据集一个做法。
标签:语句,execute,SET,SpringBoot,RAISERROR,添加,SQL,NOCOUNT From: https://www.cnblogs.com/passacaglia/p/18474306