简介
- 事务作用:在数据层保障一系列的数据库操作同成功同失败
- Spring事务作用:在数据层或业务层保障一系列的数据库操作同成功同失败
public interface PlatformTransactionManager{
void commit(TransactionStatus status) throws TransactionStatus ;
void rollback(TransactionStatus status) throws TransactionStatus ;
}
基本流程
1、配置当前接口方法具有事务
public interface AccountService {
/**
* 转账操作
* @param out 传出方
* @param in 转入方
* @param money 金额
*/
//配置当前接口方法具有事务
@Transactional
public void transfer(String out,String in ,Double money) ;
}
2、配置事务管理器,mybatis
使用的是jdbc
事务
JdbcConfig.java
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;
}
}
3、开启注解式事务驱动
SpringConfig.java
@Configuration
@ComponentScan("com.itheima")
@PropertySource("classpath:jdbc.properties")
@Import({JdbcConfig.class,MybatisConfig.class})
//开启注解式事务驱动
@EnableTransactionManagement
public class SpringConfig {
}
注意:
Spring
注解式事务通常添加在业务层接口中,而不会添加在业务层接口实现类中,降低耦合- 注解式事务可以添加到业务方法上表示当前方法开启事务,也可以添加到接口上表示当前接口所有方法开启事务
相关配置
基本格式
public interface AccountService {
/**
* 转账操作
* @param out 传出方
* @param in 转入方
* @param money 金额
*/
//配置当前接口方法具有事务
@Transactional(readOnly = true,timeout = -1)
public void transfer(String out,String in ,Double money) ;
}
回滚
- 自动回滚,当方法抛出运行时异常(
RuntimeException
)及其子类或者错误(Error
) - 显式回滚,对于那些不是运行时异常的受检异常(即
Exception
类型但不属于RuntimeException
的异常),Spring
不会自动回滚事务。然而,你可以在@Transactional
注解中使用rollbackFor
属性来指定哪些具体的异常类型应该触发事务回滚。
public interface AccountService {
/**
* 转账操作
* @param out 传出方
* @param in 转入方
* @param money 金额
*/
//配置当前接口方法具有事务
@Transactional(rollbackFor = {IOException.class,FileNotFoundException.class})
public void transfer(String out,String in ,Double money) ;
}
设置事务传播行为
public interface AccountService {
@Transactional
public void transfer(String out,String in ,Double money) throws IOException;
}
public interface LogService {
//propagation设置事务属性:传播行为设置为当前操作需要新事务
@Transactional(propagation = Propagation.REQUIRES_NEW)
void log(String out, String in, Double money);
}
@Service
public class AccountServiceImpl implements AccountService {
@Autowired
private AccountDao accountDao;
@Autowired
private LogService logService;
public void transfer(String out, String in, Double money) {
try {
accountDao.outMoney(out, money);
int i = 1 / 0;
accountDao.inMoney(in, money);
} finally {
logService.log(out, in, money);
}
}
}
通过设置propagation
属性,让某一个操作创建新的事务,保证不会被其他事务的影响