目录
编程式事务
简单案例
TransactionTemplate
PlatformTransactionManager
声明式事务
简单使用
简单实例
@Transactional常用属性
事务传播行为
需要注意的点
编程式事务管理是侵入性事务管理,使用TransactionTemplate或者直接使用PlatformTransactionManager,对于编程式事务管理,Spring推荐使用TransactionTemplate。
@Configuration
public class MyPlatformTransactionManager {
@Bean
public TransactionTemplate transactionTemplate(PlatformTransactionManager platformTransactionManager){
TransactionTemplate transactionTemplate = new TransactionTemplate();
transactionTemplate.setTransactionManager(platformTransactionManager);
return transactionTemplate;
}
}
@Autowired
TransactionTemplate transactionTemplate;
@Override
public int insertTran(int id, String username, String password) {
Integer p = transactionTemplate.execute(status -> {
userService.insertTran(8, "dd", "ff");
userService.insertTran(9, "dd", "ff");
userService.insertTran(10, "dd", "ff");
int i = userService.insertTran(id, username, password);
return i;
});
return p;
}
@Autowired
private PlatformTransactionManager txManager ;
//模板
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
TransactionStatus status = txManager.getTransaction(def);
int result = 0;
try {
result=//dosomething
txManager.commit(status);
}catch (Exception e){
txManager.rollback(status);
}
return result;
声明式事务管理建立在AOP之上,其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,执行完目标方法之后根据执行的情况提交或者回滚。
第一步,注解开启支持
@EnableTransactionManagement
第二步,在想要事务管理的服务层加上事务管理注解
@Transactional
拿最简单的插入语句来说,我们想要实现多个插入,只要有一个插入不成功就全部回滚。
只需要在插入的方法上使用@Transactional即可
@Override
@Transactional
//随便模拟了一个插入,id是主键,如果id重复出现异常,则全部回滚
public int insertTran(int id, String username, String password) {
userService.insertTran(5,"dd","ff");
userService.insertTran(6,"dd","ff");
userService.insertTran(7,"dd","ff");
int i = userService.insertTran(id, username, password);
return i;
}
propagation:事务的传播行为,默认值为 REQUIRED。
isolation:事务的隔离度,默认值采用 DEFAULT。
timeout:事务的超时时间,默认值为-1,不超时。如果设置了超时时间(单位秒),那么如果超过该时间限制了但事务还没有完成,则自动回滚事务。
read-only:指定事务是否为只读事务,默认值为 false;为了忽略那些不需要事务的方法,比如读取数据,可以设置 read-only 为 true。
rollbackFor:用于指定能够触发事务回滚的异常类型,如果有多个异常类型需要指定,各类型之间可以通过逗号分隔。{xxx1.class, xxx2.class,……}
noRollbackFor:抛出 no-rollback-for 指定的异常类型,不回滚事务。{xxx1.class, xxx2.class,……}
在我们执行一个事务方法时,另一边也同时执行了该方法。那么我们这个时候就要通过事务传播来处理。