大纲:
- 声明式事务
- 编程式事务
一、声明式事务
纳入spring事务管理只需要在方法或这类上@Transactional 就行了。
- 加在方法上表示这个方法纳入管理,加载类上表示整个类的方法纳入管理。方法和类上都声明则优先级顺序为方法>实现类>接口。
- 多数据源时@Transactional("DataSourceTransactionManager")注解中填写spring配置DataSourceTransactionManager的名称。
- @Transactional还可以指定隔离级别,超时等。
- 同类中yy方法直接调用xx,事务不生效。
- xx方法需要public权限。
- 抛出RuntimeException时生效,业务代码1没有编译时异常,可以生效,业务代码2有编译时异常,需要手动catch,手动回滚。
@Transactional public void xx(){
业务1; try { 业务2; } catch (Exception e) { //回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } }
private void yy(){
//事务无效
xx();
}
二、编程式事务
PlatformTransactionManager
- DefaultTransactionDefinition指定超时,隔离级别等。
- 多数据源需要Qualifierspring指定配置DataSourceTransactionManager的名称。
- 声明式的不能做到每次分开提交回滚、控制粒度不如编程式的。例如在一个循环中,编程式的可以每次循环都新开事务提交或回滚。
@Autowired @Qualifier("transactionManagerName") PlatformTransactionManager transactionManager; public void testx() { TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition()); try { //业务 transactionManager.commit(status); } catch (Exception e) { transactionManager.rollback(status); e.printStackTrace(); } }