Spring事务

推荐先阅读Spring全家桶

简介

事务作用:在数据层保障一系列的数据库操作同成功同失败

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

Spring为了管理事务,提供了一个平台事务管理器PlatformTransactionManager

public interface PlatformTransactionManager{
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
}

转账案例

1.在业务层接口上添加Spring事务管理

// 加在接口表示所有方法都开启事务
// @Transactional
public interface AccountService {
// 加在方法上指定某一方法
@Transactional
public void transfer(String out,String in ,Double money);
}

注解通常加在接口而非实现类,降低耦合。

2.设置事务管理器

//配置事务管理器,mybatis使用的是jdbc事务
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource){
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
transactionManager.setDataSource(dataSource);
return transactionManager;
}

事务管理器要根据使用技术进行选择,

Mybatis框架使用的是JDBC事务,可以直接使用DataSourceTransactionManager

3.开启注解式事务驱动

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

Spring事务角色

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

image-20220811202615572

Spring事务属性

image-20220811204624726

Spring事务传播行为

image-20220811205826949

image-20220811210251515

转账业务追加日志

在业务层接口上添加Spring事务,设置事务传播行为为REQUIRES_NEW(需要新事务)

@Service
public class LogServiceImpl implements LogService {

@Autowired
private LogDao logDao;
//propagation设置事务属性:传播行为设置为当前操作需要新事务
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void log(String out,String in,Double money ) {
logDao.log("转账操作由"+out+"到"+in+",金额:"+money);
}
}