🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## SagaMapper SagaMapper是自动生成逆向操作,是BeetlSQL的Saga实现重要的一环。 BeetlSQL通过SagaMapper来自动生成逆向SQL,同BaseMapper类似,但有自己的实现方式 ```java public interface SagaMapper<T> { /** sega 改造的接口**/ @AutoMapper(SagaInsertAMI.class) void insert(T entity); @AutoMapper(SagaUpdateByIdAMI.class) int updateById(T entity); @AutoMapper(SagaDeleteByIdAMI.class) int deleteById(Object key); /** 正常接口 **/ @AutoMapper(SingleAMI.class) T single(Object key); @AutoMapper(UniqueAMI.class) T unique(Object key); @AutoMapper(SelectByIdsAMI.class) List<T> selectByIds(List<?> key); } ``` 可以看到,insert方法的实现是SagaInsertAMI而不是InsertAMI,SagaInsertAMI代码如下 ```java @Override public Object call(SQLManager sm, Class entityClass, Method m, Object[] args) { int ret = sm.insert(args[0]); //逆向操作 SagaContext sagaContext = SagaContext.sagaContextFactory.current(); Class target = args[0].getClass(); String idAttr = sm.getClassDesc(target).getIdAttr(); Object key = BeanKit.getBeanProperty(args[0],idAttr); sagaContext.getTransaction().addTask(new InsertSagaRollbackTask(sm.getName(),target,key) ); return ret; } @Data public static class InsertSagaRollbackTask implements SagaRollbackTask { //todo } ``` SagaInsertAMI除了调用SQLManager完成insert操作,BeetlSQL也会记录一个反向操作到sagaContext里,如果在Saga事务环境里要求回滚,则会执行这个方向操作 除了内置操作提供回滚外,SagaMapper支持提供反向sql的注解 @SagaUpdateSql ```java @SagaUpdateSql( sql="update stock set count=count+1 where id=?", rollback = "update stock set count=count-1 where id=? and count!=0" ) void addStock(String id); ``` @SagaUpdateSql同@Sql,但提供了反向SQL,一旦要求saga回滚,则执行rollback表示 > 对于更新操作,Saga认为如果更新api返回0,则说明回滚失败。比如上面库存,因为id不存在或者count=0情况下,更新失败。