1.自动提交(注解事务)
1.方法上增加@Trasactional注解
@Transactional注解是通过AOP方式实现的,默认捕获RuntimeException的异常并触发方法中所有数据库操作(增、删、改)回滚。如果自定义异常需要设置,@Transactional(rollbackOn = Exception.class)
2.在配置文件中或者启动类上开始事务
SpringBoot在启动类上加@EnableTransactionManagement注解就行(开启注解事务管理,等同于xml配置方式的 <tx:annotation-driven />)
注:需要将异常异常信息抛出到上层框架,如果catch处理了的异常,不会被事物作为判断依据;如果异常被catch 了,但是又在catch中抛出了新的异常,那么事物会以这个新的异常作 为是否进行回滚的判断依据。
使用声明式注解时,除了向外层抛出异常外,我们还可以主动设置事务需要回滚(需要在方法上增加@Trasactional)
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
@Transactional(rollbackOn = Exception.class)
public void tranDelNoAutoZJ(String name) {
User deleteUer = userRepository.findOneByName(name);
if (deleteUer != null) {
userRepository.deleteById(deleteUer.getId());
}
if (deleteUer.getId() % 2 == 0) {
} else {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
//主动设置事务需要回滚
}
}
2.手动事务
//这个是JDBC的事务管理器实现类,不同ORM使用不同,它的接口是PlatformTransactionManager
@Autowired
DataSourceTransactionManager dataSourceTransactionManager;
//手动开启事务
@Autowired
TransactionDefinition transactionDefinition;
TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
//手动提交事务
dataSourceTransactionManager.commit(transactionStatus);//提交
//手动回滚事务
//最好是放在catch 里面,防止程序异常而事务一直卡在哪里未提交
dataSourceTransactionManager.rollback(transactionStatus);
DataSourceTransactionManager 的继承图:

基于接口事务:
/**
* 事务管理器的接口
*/
@Autowired
private PlatformTransactionManager platformTransactionManager;
/**
* 接口
*/
@Autowired
private TransactionDefinition transactionDefinition;
@Test
public void manualTransactionalTest() {
TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition);
try {
UserInfo userInfo = new UserInfo();
iUserInfoService.insertData(userInfo);
UserInfo userInfo1 = new UserInfo();
iUserInfoService.insertData(userInfo1);
platformTransactionManager.commit(transactionStatus);
} catch (Exception exception) {
platformTransactionManager.rollback(transactionStatus);
}
}
Spring Mybatis开启事务
@Autowired
DataSourceTransactionManager dataSourceTransactionManager;
public void tranDelNoAuto(String name) {
DefaultTransactionDefinition defaultTransactionDefinition = new DefaultTransactionDefinition();
TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(defaultTransactionDefinition);
User deleteUer = userRepository.findOneByName(name);
if (deleteUer != null) {
userRepository.deleteById(deleteUer.getId());
}
if (deleteUer.getId() % 2 == 0) {
dataSourceTransactionManager.commit(transactionStatus);
} else {
dataSourceTransactionManager.rollback(transactionStatus);
}
}
Spring Data Jpa开启事务
@Autowired
JpaTransactionManager jpaTransactionManager;
public void tranDelNoAuto(String userName) {
DefaultTransactionDefinition defaultTransactionDefinition = new DefaultTransactionDefinition();
TransactionStatus transactionStatus = jpaTransactionManager.getTransaction(defaultTransactionDefinition);
User delteUser = iUserDao.findByUsername(userName);
if (delteUser != null) {
iUserDao.deleteById(delteUser.getUserid());
}
if (delteUser.getUserid() % 2 == 0) {
jpaTransactionManager.commit(transactionStatus);
} else {
jpaTransactionManager.rollback(transactionStatus);
}
}
3.TransactionTemplate手动提交事务
//注入TransactionTemplate
@Bean
@ConditionalOnMissingBean
public TransactionTemplate transactionTemplate() {
//return new TransactionTemplate(this.dataSourceTransactionManager);
return new TransactionTemplate();
}
@Autowired
private TransactionTemplate transactionTemplate;
@Test
public void transactionTemplateTest() {
transactionTemplate.execute((transactionStatus) -> {
UserInfo userInfo = new UserInfo();
iUserInfoService.insertData(userInfo);
UserInfo userInfo1 = new UserInfo();
iUserInfoService.insertData(userInfo1);
return true;
});
}
539

被折叠的 条评论
为什么被折叠?



