写点什么

Spring

作者:倔强的牛角
  • 2022 年 6 月 21 日
  • 本文字数:1735 字

    阅读完需:约 6 分钟

Spring

写在前面😘

大一电子信息工程新生,请多多关照,希望能在掘金记录自己的学习历程!

【Spring 学习笔记】 系列教程基于 Spring 5.2.10.RELEASE讲解。

6.1.4 事务管理

上述环境,运行单元测试类,会执行转账操作,Tom的账户会减少 100,Jerry的账户会加 100。


这是正常情况下的运行结果,但是如果在转账的过程中出现了异常,如:


@Servicepublic class AccountServiceImpl implements AccountService {
@Autowired private AccountDao accountDao;
public void transfer(String out,String in ,Double money) { accountDao.outMoney(out,money); int i = 1/0; accountDao.inMoney(in,money); }
}
复制代码


这个时候就模拟了转账过程中出现异常的情况,正确的操作应该是转账出问题了,Tom应该还是 900,Jerry应该还是 1100,但是真正运行后会发现,并没有像我们想象的那样,Tom账户为 800 而Jerry还是 1100,100 块钱凭空消息了,银行乐疯了。如果把转账换个顺序,银行就该哭了。


不管哪种情况,都是不允许出现的,对刚才的结果我们做一个分析:


①:程序正常执行时,账户金额 A 减 B 加,没有问题


②:程序出现异常后,转账失败,但是异常之前操作成功,异常之后操作失败,整体业务失败


当程序出问题后,我们需要让事务进行回滚,而且这个事务应该是加在业务层上,而 Spring 的事务管理就是用来解决这类问题的。


Spring 事务管理具体的实现步骤为:

步骤 1:在需要被事务管理的方法上添加注解
public interface AccountService {    /**     * 转账操作     * @param out 传出方     * @param in 转入方     * @param money 金额     */    //配置当前接口方法具有事务    public void transfer(String out,String in ,Double money) ;}
@Servicepublic class AccountServiceImpl implements AccountService {
@Autowired private AccountDao accountDao; @Transactional public void transfer(String out,String in ,Double money) { accountDao.outMoney(out,money); int i = 1/0; accountDao.inMoney(in,money); }
}
复制代码


==注意:==


@Transactional 可以写在接口类上、接口方法上、实现类上和实现类方法上


  • 写在接口类上,该接口的所有实现类的所有方法都会有事务

  • 写在接口方法上,该接口的所有实现类的该方法都会有事务

  • 写在实现类上,该类中的所有方法都会有事务

  • 写在实现类方法上,该方法上有事务

  • ==建议写在实现类或实现类的方法上==

步骤 2:在 JdbcConfig 类中配置事务管理器
public class JdbcConfig {    @Value("${jdbc.driver}")    private String driver;    @Value("${jdbc.url}")    private String url;    @Value("${jdbc.username}")    private String userName;    @Value("${jdbc.password}")    private String password;
@Bean public DataSource dataSource(){ DruidDataSource ds = new DruidDataSource(); ds.setDriverClassName(driver); ds.setUrl(url); ds.setUsername(userName); ds.setPassword(password); return ds; }
//配置事务管理器,mybatis使用的是jdbc事务 @Bean public PlatformTransactionManager transactionManager(DataSource dataSource){ DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(); transactionManager.setDataSource(dataSource); return transactionManager; }}
复制代码


**注意:**事务管理器要根据使用技术进行选择,Mybatis 框架使用的是 JDBC 事务,可以直接使用DataSourceTransactionManager

步骤 3:开启事务注解

在 SpringConfig 的配置类中开启


@Configuration@ComponentScan("com.itheima")@PropertySource("classpath:jdbc.properties")@Import({JdbcConfig.class,MybatisConfig.class//开启注解式事务驱动@EnableTransactionManagementpublic class SpringConfig {}
复制代码
步骤 4:运行测试类

会发现在转换的业务出现错误后,事务就可以控制回顾,保证数据的正确性。

知识点 1:@EnableTransactionManagement
知识点 2:@Transactional

写在后面🍻

感谢观看啦✨

有什么不足,欢迎指出哦💖

发布于: 刚刚阅读数: 3
用户头像

把学问造就,还期身健行优。 2022.06.02 加入

大一在读,电子信息工程专业。 希望在InfoQ写作社区记录自己的学习历程!

评论

发布
暂无评论
Spring_6月月更_倔强的牛角_InfoQ写作社区