首先spring中事务有两种方式:编程事务 、声明事务
编程事务:
获取项目中事务管理器 DataSourceTransactionManager
采用事务管理提交回滚操作
@Component
public class TransactionUtils {
@Autowired
private DataSourceTransactionManager dataSourceTransactionManager;
//获取当前事务
public TransactionStatus begin(){
//采用默认传播行为
TransactionStatus transaction = dataSourceTransactionManager.getTransaction(new DefaultTransactionAttribute());
return transaction;
}
//提交
public void commit(TransactionStatus transaction){
dataSourceTransactionManager.commit(transaction);
}
public void rollback(TransactionStatus transaction){
dataSourceTransactionManager.rollback(transaction);
}
}
业务层
@RestController
public class TxServiceImpl {
@Autowired
private TransactionUtils transactionUtils;
//采取事务
@GetMapping("/tx")
public String insertUser(User user){
TransactionStatus begin == null;
//begin开启事务,若不提交相当于对数据使用行锁
try {
begin = transactionUtils.begin();
String res = userMapper.insert(user)>0?"成功":"失败";
int j = 1/user.getUserId();
transactionUtils.commit(begin);
return res;
}catch (Exception e){
if (begin != null){
transactionUtils.rollback(begin);
return "系统错误";
}
}
}
}
代码重复性强,扩展性好
声明事务:
只需要加入注解 @Transactional
当方法执行完,aop采取拦截,判断成功还是异常采取对应的操作
失效问题:
当方法中用try捕获异常,异常不会抛到aop,则不会回滚,
需要手动回滚在catch中使用
TransactionAspectSupport.currentTransactionStatus().set
RollbackOnly();
自定义注解
创建注解
//作用范围
@Target({ElementType.METHOD,ElementType.TYPE})
//通过反射机制获取注解
@Retention(RetentionPolicy.RUNTIME)
@Inherited
//注释文档
@Documented
public @interface MyTransactional {
}
定义aop拦截方法
@Component
@Aspect
public class ExtTransactionalAop {
@Autowired
private TransactionUtils transactionUtils;
//拦截方法上有自定义注解 走环绕通知
@Around(value = "@annotation(com.lzq.aop.MyTransactional)")
public Object around(ProceedingJoinPoint joinPoint){
TransactionStatus begin = null;
try {
begin = transactionUtils.begin();
//获取目标方法
Object res = joinPoint.proceed();
transactionUtils.commit(begin);
return res;
} catch (Throwable throwable) {
throwable.printStackTrace();
if (begin != null){
transactionUtils.rollback(begin);
}
return "系统错误";
}
}
}
此时将自定义注解加在方法上即可
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/2835.html