tx-lcn icon indicating copy to clipboard operation
tx-lcn copied to clipboard

txc模式下根据ID来Delete某条数据时,模拟事务异常后补偿失败

Open mujichen opened this issue 5 years ago • 0 comments

demo主要以txlcn-demo构建,版本是5.0.2。大致流程为serviceA调用serviceB删除某条数据的方法,该方法是通过JpaRepository的deleteById实现的。serviceA模拟异常发生后,serviceB开始尝试数据补偿,逆向插入删除的那条数据,但是我根据日志和断点发现,补偿的sql语句是正常的,但是参数数组却多了一个参数,其参数值为null,最终无法执行SQL导致补偿失败。

数据库表

 CREATE TABLE `tb_description`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 19 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

数据记录

id user_id description
2 123456 will be delete

service B的代码

@Service
@Transactional//本地事务
public class TestServiceImpl implements TestService {

    @Autowired
    DescriptionDao descriptionDao;

    @Override
    @TxcTransaction//分布式事务
    public TbDescription txlcn(Integer userId) {
        descriptionDao.deleteById(Integer.valueOf(2));

        TbDescription updateDesc = new TbDescription();
        updateDesc.setId(1);
        updateDesc.setDescription("new");
        updateDesc.setUserId(123456);
        return updateDesc;
    }

}

@Repository
public interface DescriptionDao extends JpaRepository<TbDescription,Integer> {
}

控制台部分日志

statement > SELECT tbdescript0_.id AS id1_0_0_, tbdescript0_.description AS descript2_0_0_, tbdescript0_.user_id AS user_id3_0_0_ FROM tb_description tbdescript0_ WHERE tbdescript0_.id = 2
statement > DELETE FROM tb_description WHERE id = 2
txc > Apply undo log. sql: INSERT INTO tb_description(tb_description.user_id, tb_description.description, tb_description.id) values(?, ?, ?), params: [123456, will be delete, 2, null]

mujichen avatar May 25 '20 09:05 mujichen