springboot整合shardingsphere和seata实现分布式事务的实践
作者:「已注销」 时间:2021-08-10 04:28:37
各个框架版本信息
springboot: 2.1.3
springcloud: Greenwich.RELEASE
seata: 1.0.0
shardingsphere:4.0.1
maven 依赖
<dependency>
<!--<groupId>io.shardingsphere</groupId>-->
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
</dependency>
<!--sharding-jdbc 4.0.0 以后版本不能加starter 会导致启动数据源冲突-->
<!--<dependency>-->
<!--<groupId>com.alibaba</groupId>-->
<!--<artifactId>druid-spring-boot-starter</artifactId>-->
<!--</dependency>-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<exclusions>
<exclusion>
<groupId>io.seata</groupId>
<artifactId>seata-all</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-all</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-transaction-base-seata-at</artifactId>
</dependency>
需要增加的切面类
@Component
@Aspect
@Slf4j
public class SeataTransactionalAspect {
@Before("execution(* com.XXX.dao.*.*(..))")
public void before(JoinPoint joinPoint) throws TransactionException {
MethodSignature signature = (MethodSignature)joinPoint.getSignature();
Method method = signature.getMethod();
log.info("拦截到需要分布式事务的方法," + method.getName());
if(StringUtils.startsWithAny(method.getName(),"insert","save"
,"update","delete")){
TransactionTypeHolder.set(TransactionType.BASE);
}
}
}
ProductServiceImpl代码
@Service
public class ProductServiceImpl implements ProductService {
@Resource
UserFeignClient userFeignClient;
@Resource
ProductDao productDao;
@Override
@GlobalTransactional(name="zhjy-product-tx-group",rollbackFor = Exception.class)
public void createProduct(Product product) {
productDao.insertProduct(product);
ProductDesc proDesc = new ProductDesc();
proDesc.setProductDesc(product.getProductDesc());
proDesc.setStoreId(product.getStoreId());
proDesc.setProductId(product.getProductId());
productDao.insertProductDesc(proDesc);
// if(product.getProductName().endsWith("5")){
// int i = 1/0;
// }
// int j = 1/0;
User user = new User();
user.setAge(product.getPrice().intValue());
user.setUserName(product.getProductName());
user.setRealName(product.getProductName());
String msg = userFeignClient.saveUser(user);
//由于开启了服务调用降级,所以需要统一返回错误码,根据错误码主动抛出异常,让seata回滚事务
if(msg.equals("新增用户失败")){
int i = 1/0;
}
}
}
UserFeignClient代码
@FeignClient(name="service-user",fallbackFactory =UserFeignClientFallbackFactory.class)
public interface UserFeignClient {
@GetMapping("/user/getUserById")
@ResponseBody
String getUserById(@RequestParam("id") Integer id);
@GetMapping("/user/getUserByIdWithPathVariable/{id}")
@ResponseBody
String getUserByIdWithPathVariable(@PathVariable("id") Integer id);
@PostMapping("/user/saveUser")
@ResponseBody
String saveUser(@RequestBody User user );
}
User服务 UserController代码
@RestController
@Slf4j
@RefreshScope
public class UserController {
@Autowired
UserService userService;
@PostMapping("/user/saveUser")
@ResponseBody
public String saveUser(@RequestBody User user) {
userService.saveUser(user.getUserName(),user.getRealName(),user.getAge());
// if(user.getAge()>5){
int i = 1/0;
// }
return "sucess";
}
}
UserServiceImpl代码
@Service
public class UserServiceImpl implements UserService {
@Resource
UserDao userDao;
@Override
public void saveUser(String userName, String realName, Integer age) {
userDao.insertUser(userName,realName,age);
}
}
来源:https://blog.csdn.net/weixin_47574208/article/details/105948175
标签:springboot,shardingsphere,分布式事务
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Java结构型设计模式中建造者模式示例详解
2023-04-24 13:37:31
![](https://img.aspxhome.com/file/2023/6/60286_0s.png)
Java实战入门之双色球彩票小游戏
2023-05-12 04:07:13
![](https://img.aspxhome.com/file/2023/6/63486_0s.png)
Java8 Comparator源码演示及解析
2023-09-18 10:51:12
![](https://img.aspxhome.com/file/2023/1/58581_0s.png)
浅谈MyBatis3 DynamicSql风格语法使用指南
2023-11-25 13:05:06
探讨:android项目开发 统筹兼顾 需要考虑的因素
2023-08-05 11:21:32
通过Java实现在Word中创建可填充表单
2023-08-05 21:11:40
![](https://img.aspxhome.com/file/2023/4/58034_0s.jpg)
java实现连连看游戏课程设计
2023-10-30 13:18:37
Java web访问localhost报404错误问题的解决方法
2023-07-27 05:28:55
![](https://img.aspxhome.com/file/2023/3/57913_0s.png)
Java8新特性之泛型的目标类型推断_动力节点Java学院整理
2023-11-26 10:38:21
SSM框架搭建图文教程(推荐)
2023-11-10 20:39:07
![](https://img.aspxhome.com/file/2023/1/59061_0s.png)
mybatis-plus中lambdaQuery()与lambdaUpdate()比较常见的使用方法总结
2023-11-24 22:43:04
![](https://img.aspxhome.com/file/2023/6/60156_0s.jpg)
Java Timer使用讲解
2023-11-28 20:30:33
使用反射方式获取JPA Entity的属性和值
2023-07-24 17:43:22
Java多线程ThreadPoolExecutor详解
2023-11-23 18:39:32
Java编程中的检查型异常与非检查型异常分析
2023-11-04 13:08:38
C++程序中启动线程的方法
2023-06-28 03:35:02
Java基础之面向对象机制(多态、继承)底层实现
2023-11-12 02:59:59
Java实现顺序表和链表结构
2023-11-13 09:35:43
![](https://img.aspxhome.com/file/2023/2/62832_0s.jpg)
SpringBoot整合之SpringBoot整合MongoDB的详细步骤
2023-11-25 09:55:37
![](https://img.aspxhome.com/file/2023/6/59076_0s.png)
Spring @ComponentScan注解扫描组件原理
2021-09-21 09:10:02