关于雪花算法导致seata无法回滚

Blade 已结 2 613
JC
JC 2022-11-06 20:54

一、该问题的重现步骤是什么?

1.  

官方SeataStorageApplication ,SeataOrderApplication两个服务配置好后
在 StorageServiceImpl 添加baseMapper.saveAffair();
@Override
@Transactional(rollbackFor = Exception.class)
public int deduct(String commodityCode, int count) {
   Storage storage = baseMapper.selectOne(Wrappers.query().lambda().eq(Storage::getCommodityCode, commodityCode));
   if (storage.getCount() < count) {
      throw new RuntimeException("超过库存数,扣除失败!");
   }
   baseMapper.saveAffair(); //这个
   storage.setCount(storage.getCount() - count);
   return baseMapper.updateById(storage);
}
insert into BASE_AFFAIR_SEATA (id,

  name)
   values (1589225269638524929,  'TEST'
     )   无法回滚

2. 

insert into BASE_AFFAIR_SEATA (id,

  name)
   values ('1589225269638524929',  'TEST'
     ) 可以回滚

3.sql

CREATE TABLE "OA_DATA"."BASE_AFFAIR_SEATA" 
   (	"ID" NUMBER(20,0) NOT NULL ENABLE, 
	"NAME" VARCHAR2(255), 
	 PRIMARY KEY ("ID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "OA_DATA"  ENABLE
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "OA_DATA"


二、你期待的结果是什么?实际看到的又是什么?

 雪花算法生成的Long类型的ID可以回滚

三、你正在使用的是什么产品,什么版本?在什么操作系统上?

3.0.1.RELEASE  window10  oracle

四、请提供详细的错误堆栈信息,这很重要。


五、若有更多详细信息,请在下面提供。




2条回答
  •  admin
    admin (楼主)
    2022-11-07 12:26

    应该是oracle下的long类型id没法回滚,mysql、pg、sqlserver都是可以的,看来是seata官方的bug,升级一下jdbc另外需要给他们发一个issue来处理一下。

提交回复