多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## BeetlSQL Saga BeetlSQL提供俩种Saga实现但只需一种编码风格。第一种实现是用于单机多库,第二种实现则是你觉得需要改成微服务的时候,可以无缝切换成微服务 第一种适用于单体系统,需要操作多个库。不需要Saga-Server参与 ```java /** * 参考代码org.beetlsql.sql.saga.test.standalone.StandaloneSagaTest 或者 springboot * org.beetlsql.sql.saga.test.spring.SpringBootSagaTest */ @Test public void simple(){ SagaContext sagaContext = SagaContext.sagaContextFactory.current(); UserMapper userMapper = sqlManager.getMapper(UserMapper.class); long count = sqlManager.allCount(User.class); try{ sagaContext.start() User user = new User(); user.setName("abc"); userMapper.insert(user); User user2 = new User(); user2.setName("efg"); userMapper.insert(user2); if(1==1){ throw new RuntimeException("模拟异常"); } sagaContext.commit(); }catch(RuntimeException ex){ sagaContext.rollback(); } long afterCount = sqlManager.allCount(User.class); Assert.assertEquals(count,afterCount); } ``` 假设User是个多库设计(关于BeetlSQL如何使用分库分表,参考BeetlSQL3 多库使用),开发者只需在套用如下模板 ```java SagaContext sagaContext = SagaContext.sagaContextFactory.current(); try{ sagaContext.start(); //任何操作,或者是调用嵌套Saga事务的其他代码 sagaContext.commit(); }(Exception ex){ sagaContext.rollback(); } ``` 第二种适合微服务,BeeltSQL还需要通过Saga—Server来管理回滚任务,但编程模式跟上面是一致的,如下 ```java /** * 代码参考 源码 sql-saga/sql-saga-microservice/sql-saga-microservice-demo */ SagaContext sagaContext = SagaContext.sagaContextFactory.current(); try { //需要一个gid标志唯一的事务,如订单号 sagaContext.start(gid); //模拟调用俩个微服务,订单和用户,订单系统和用户系统也可以使用同样的模板 rest.postForEntity(orderAddUrl, null,String.class, paras); rest.postForEntity(userBalanceUpdateUrl, null,String.class, paras); if (1 == 1) { throw new RuntimeException("模拟失败,查询saga-server 看效果"); } } catch (Exception e) { sagaContext.rollback(); return e.getMessage(); } ```