全局的事务处理
使用方法
特别提醒:mysql对应的表必须是InnoDB型才可支持事务,myisam不支持事务
导入springboot的aop依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
创建一个全局事务处理的配置类
这里注意2点:
- execution的内容
execution(* com..service..*.*(..))
- 使用TransactionManager,使用这个类的时候不会报过时警告,PlatformTransactionManager会有过时警告
- service层记得打@Service注解
@Aspect
@Configuration
public class TransactionAdviceConfig {
private static final String AOP_POINTCUT_EXPRESSION = "execution(* com..service..*.*(..))";
@Autowired
private TransactionManager transactionManager;
@Bean
public TransactionInterceptor txAdvice() {
DefaultTransactionAttribute txAttr_REQUIRED = new DefaultTransactionAttribute();
txAttr_REQUIRED.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
DefaultTransactionAttribute txAttr_REQUIRED_READONLY = new DefaultTransactionAttribute();
txAttr_REQUIRED_READONLY.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
txAttr_REQUIRED_READONLY.setReadOnly(true);
NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource();
source.addTransactionalMethod("save*", txAttr_REQUIRED);
source.addTransactionalMethod("delete*", txAttr_REQUIRED);
source.addTransactionalMethod("update*", txAttr_REQUIRED);
source.addTransactionalMethod("exec*", txAttr_REQUIRED);
source.addTransactionalMethod("set*", txAttr_REQUIRED);
source.addTransactionalMethod("get*", txAttr_REQUIRED_READONLY);
source.addTransactionalMethod("query*", txAttr_REQUIRED_READONLY);
source.addTransactionalMethod("select*", txAttr_REQUIRED_READONLY);
source.addTransactionalMethod("find*", txAttr_REQUIRED_READONLY);
source.addTransactionalMethod("list*", txAttr_REQUIRED_READONLY);
source.addTransactionalMethod("count*", txAttr_REQUIRED_READONLY);
source.addTransactionalMethod("is*", txAttr_REQUIRED_READONLY);
return new TransactionInterceptor(transactionManager, source);
}
@Bean
public Advisor txAdviceAdvisor() {
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
pointcut.setExpression(AOP_POINTCUT_EXPRESSION);
return new DefaultPointcutAdvisor(pointcut, txAdvice());
}
}
然后启动项目运行sql访问,查看控制台信息
Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@27ab75b]
JDBC Connection
[com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@63380d1f] will be managed by Spring
事务管理完成
在方法上使用@Transactional(rollbackFor = Exception.class)的事务处理方式
使用方法
@Transactional(rollbackFor = Exception.class)
@Service
public class xxxxService {
@Autowired
private xxxxMapper xxxxMapper;
public xxxxServer select(Integer mailId) {
return xxxxMapper.select(mailId);
}
}
使用这两种方式基本上可以做到让spring对事务的管控,上述方式如果有不足或者需要补充的地方希望大家提出和交流,一起学习一起成长✌