@Transactional注解异常报错怎么解决
发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,这篇文章主要介绍"@Transactional注解异常报错怎么解决",在日常操作中,相信很多人在@Transactional注解异常报错怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作
千家信息网最后更新 2024年09月22日@Transactional注解异常报错怎么解决
这篇文章主要介绍"@Transactional注解异常报错怎么解决",在日常操作中,相信很多人在@Transactional注解异常报错怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"@Transactional注解异常报错怎么解决"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
@Transactional注解报错之多数据源
如果在加上@Transactional注解之后报错,先查看程序是否为多数据源,之前专门有一章讲解springboot的多数据源实现。多数据源的情况下加事物注解,有可能会出现问题,以下是解决方案。
1.在配置数据源的同时
一定到在其中一个配置上加上@Primary注解,其他的不要加。
package com.wys.config;import org.apache.ibatis.session.SqlSessionFactory;import org.mybatis.spring.SqlSessionFactoryBean;import org.mybatis.spring.SqlSessionTemplate;import org.mybatis.spring.annotation.MapperScan;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.beans.factory.annotation.Value;import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Primary;import org.springframework.core.io.support.PathMatchingResourcePatternResolver;import org.springframework.jdbc.datasource.DriverManagerDataSource;import javax.sql.DataSource;/** * @program: * @description: 数据库配置1 * @author: wys * @create: 2019-12-03 16:20 **/@Configuration@MapperScan(basePackages = "com.wys.mapper.**", sqlSessionFactoryRef = "oneSqlSessionFactory")public class OneDataSourceConfig { @Value("${spring.datasource.one.driver-class-name}") String driverClass; @Value("${spring.datasource.one.url}") String url; @Value("${spring.datasource.one.username}") String userName; @Value("${spring.datasource.one.password}") String passWord; @Primary @Bean(name = "oneDataSource") @ConfigurationProperties("spring.datasource.one") public DataSource masterDataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName(driverClass); dataSource.setUrl(url); dataSource.setUsername(userName); dataSource.setPassword(passWord); return dataSource; } @Bean(name = "oneSqlSessionFactory") public SqlSessionFactory sqlSessionFactory(@Qualifier("oneDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean(); sessionFactoryBean.setDataSource(dataSource); sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources("classpath:mybatis/mapper-postgre/*.xml")); return sessionFactoryBean.getObject(); } @Bean(name = "oneSqlSessionFactory") public SqlSessionTemplate sqlSessionFactoryTemplate(@Qualifier("oneSqlSessionFactory")SqlSessionFactory sqlSessionFactory ) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); }}
2.一定要在需要使用事物注解的数据源配置里
加上创建事务管理器
package com.wys.config;import org.apache.ibatis.session.SqlSessionFactory;import org.mybatis.spring.SqlSessionFactoryBean;import org.mybatis.spring.SqlSessionTemplate;import org.mybatis.spring.annotation.MapperScan;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.beans.factory.annotation.Value;import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Primary;import org.springframework.core.io.support.PathMatchingResourcePatternResolver;import org.springframework.jdbc.datasource.DriverManagerDataSource;import javax.sql.DataSource;/** * @program: * @description: 数据库配置1 * @author: wys * @create: 2019-12-03 16:20 **/@Configuration@MapperScan(basePackages = "com.wys.mapper.**", sqlSessionFactoryRef = "oneSqlSessionFactory")public class OneDataSourceConfig { @Value("${spring.datasource.one.driver-class-name}") String driverClass; @Value("${spring.datasource.one.url}") String url; @Value("${spring.datasource.one.username}") String userName; @Value("${spring.datasource.one.password}") String passWord; @Primary @Bean(name = "oneDataSource") @ConfigurationProperties("spring.datasource.one") public DataSource masterDataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName(driverClass); dataSource.setUrl(url); dataSource.setUsername(userName); dataSource.setPassword(passWord); return dataSource; } @Bean(name = "oneSqlSessionFactory") public SqlSessionFactory sqlSessionFactory(@Qualifier("oneDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean(); sessionFactoryBean.setDataSource(dataSource); sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources("classpath:mybatis/mapper-postgre/*.xml")); return sessionFactoryBean.getObject(); } / // 创建事务管理器1 @Bean(name = "oneManager1") public PlatformTransactionManager txManager(@Qualifier("oneDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); }///////////////////////// @Bean(name = "oneSqlSessionFactory") public SqlSessionTemplate sqlSessionFactoryTemplate(@Qualifier("oneSqlSessionFactory")SqlSessionFactory sqlSessionFactory ) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); }}
在需要加注解的地方加上transactionManager 配置即可。
@Transactional(transactionManager ="oneManager1",rollbackFor=Exception.class)
@Transactional 错误使用的几种场景
@RestControllerpublic class AController { @Autowired AService aService; // 回滚 @GetMapping("direct") public void direct() { aService.testTransactional(); } // 不回滚 @GetMapping("indirect") public void indirect() { aService.testTransactionalIndirect(); } // 不回滚 @GetMapping("nonPublic") public void nonPublic() { aService.testTransactionalNonPublic(); } // 不回滚 @GetMapping("catchException") public void catchException() { aService.testTransactionalCatchException(); } // 不回滚 @GetMapping("sqlException") public void sqlException() throws SQLException { aService.testTransactionalSQLException(); } // 回滚 @GetMapping("sqlExceptionWithRollbackfor") public void sqlExceptionWithRollbackfor() throws SQLException { aService.testTransactionalSQLExceptionWithRollbackfor(); }}
@Servicepublic class AService { @Autowired TestTableDAO testTableDAO; // 回滚 @Transactional public void testTransactional() { ATestTable er = new ATestTable(); er.setSummary("test"); testTableDAO.save(er); throw new RuntimeException("exception"); } // 不回滚: 类内部方法调用本类内部的其他方法并不会引起事务行为,即使被调用方法使用@Transactional注解进行修饰 public void testTransactionalIndirect() { testTransactional(); } // 不回滚: @Transaction注解只对方法名为pubic的才生效 @Transactional void testTransactionalNonPublic() { ATestTable er = new ATestTable(); er.setSummary("test"); testTableDAO.save(er); throw new RuntimeException("exception"); } // 不回滚 @Transactional public void testTransactionalCatchException() { ATestTable er = new ATestTable(); er.setSummary("test"); testTableDAO.save(er); try { throw new RuntimeException("exception"); } catch (Exception e) { System.out.println("catch"); } } // 不回滚: @Transactional默认情况下只回滚RuntimeException和Error @Transactional public void testTransactionalSQLException() throws SQLException { ATestTable er = new ATestTable(); er.setSummary("test"); testTableDAO.save(er); throw new SQLException("exception"); } // 回滚: 指定在 SQLException 异常发生时回滚 @Transactional(rollbackFor = { SQLException.class }) public void testTransactionalSQLExceptionWithRollbackfor() throws SQLException { ATestTable er = new ATestTable(); er.setSummary("test"); testTableDAO.save(er); throw new SQLException("exception"); }}
@Repositorypublic interface TestTableDAO extends JpaRepository, JpaSpecificationExecutor { }
@Entity@Data@Table(name = "test")public class ATestTable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) int id; @Column(name = "summary", length = 512) String summary;}
到此,关于"@Transactional注解异常报错怎么解决"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
注解
数据
数据源
配置
方法
学习
事务
事务管理
事物
情况
数据库
更多
问题
帮助
管理
实用
接下来
同时
地方
场景
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
电商服务软件开发
net服务器
服务器安装数据库是要干嘛的
上海心蕊网络技术有限公司
数据库飞天
软件开发行业增值税税率
水稻品种龙粳31数据库
金融信息技术与数据库有关系吗
访问实时数据库
hnmr数据库查询免费
国资云介绍ppt 网络安全
数据库中服务器IP
5g网络技术优点
mes服务器上门维修
工行软件开发中心珠海办公室
网络安全知识达人线上竞赛
医学 数据库 药学
app抢单软件开发高手
贵州网络安全培训简单易学
数据库系统的特点是什么数据独立
自己能做游戏服务器吗
房地产成本数据库建立思路
工业网络技术考事业编
数据库中服务器IP
软件开发合同逾期违约赔偿标准
服务器有网络安全模式吗
贵州省网络安全应急指挥中心公示
网络安全读物
计算机网络技术学物理吗
网络技术总监月薪