关注
Spring事务

基础概念 

- 事务作用:在数据层保障一系列的数据库操作同成功同失败
- Spring事务作用:在数据层或**==业务层==**保障一系列的数据库操作同成功同失败

事务管理实现步骤 

步骤1:在需要被事务管理的方法上添加注解

public interface AccountService {
    /**
     * 转账操作
     * @param out 传出方
     * @param in 转入方
     * @param money 金额
     */
    //配置当前接口方法具有事务
    public void transfer(String out,String in ,Double money) ;
}
​
@Service
public 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:开启事务注解

@Configuration
@ComponentScan("com.itheima")
@PropertySource("classpath:jdbc.properties")
@Import({JdbcConfig.class,MybatisConfig.class
//开启注解式事务驱动
@EnableTransactionManagement
public class SpringConfig {
}

 Spring事务角色

这节中我们重点要理解两个概念,分别是事务管理员事务协调员

- 事务管理员:发起事务方,在Spring中通常指代业务层开启事务的方法
- 事务协调员:加入事务方,在Spring中通常指代数据层方法,也可以是业务层方法

    目前的事务管理是基于DataSourceTransactionManagerSqlSessionFactoryBean使用的是同一个数据源

 * AccountDao的outMoney因为是修改操作,会开启一个事务T1
* AccountDao的inMoney因为是修改操作,会开启一个事务T2
* AccountService的transfer没有事务,

  •   * 运行过程中如果没有抛出异常,则T1和T2都正常提交,数据正确
  •   * 如果在两个方法中间抛出异常,T1因为执行成功提交事务,T2因为抛异常不会被执行
  •   * 就会导致数据出现错误

 

  • transfer上添加了@Transactional注解,在该方法上就会有一个事务T

  • AccountDao的outMoney方法的事务T1加入到transfer的事务T中

  • AccountDao的inMoney方法的事务T2加入到transfer的事务T中

  • 这样就保证他们在同一个事务中,当业务层中出现异常,整个事务就会回滚,保证数据的准确性。

 Spring事务属性

在这一节中,我们主要学习三部分内容`事务配置`、`转账业务追加日志`、`事务传播行为`

事务配置

  • * readOnly:true只读事务,false读写事务,增删改要设为false,查询设为true。
  • * timeout:设置超时时间单位秒,在多长时间之内事务没有提交成功就自动回滚,-1表示不设置超时时间。
  • * rollbackFor:当出现指定异常进行事务回滚

Spring的事务只会对`Error异常`和`RuntimeException异常`及其子类进行事务回滚,其他的异常类型是不会回滚的,对应IOException不符合上述条件所以不回滚

 需求:实现任意两个账户间转账操作,并对每次转账操作在数据库进行留痕

==无论转账操作是否成功,均进行转账操作的日志留痕==

  • 失败原因:日志的记录与转账操作隶属同一个事务,同成功同失败

事务传播行为

@Transactional(propagation = Propagation.REQUIRES_NEW)

 

转载自CSDN-专业IT技术社区

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/m0_55049655/article/details/137949875

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--