首页 > 数据库 >SpringBoot 项目的方法名是否添加@Transactional注解,以及SQL语句(SQLServer数据库)是否添加SET NOCOUNT ON时的备忘

SpringBoot 项目的方法名是否添加@Transactional注解,以及SQL语句(SQLServer数据库)是否添加SET NOCOUNT ON时的备忘

时间:2024-10-18 16:21:03浏览次数:1  
标签:语句 execute SET SpringBoot RAISERROR 添加 SQL NOCOUNT

项目改用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

相关文章