seata踩坑

  1. 如果表使用了自增主键,不要使用tkmybatis做insert操作。会导致seata无法拿到新数据的id,无法生成undo_log
  2. 1.4.2版本。生成undo_log时,无法把datetime类型的数据转化为json。
    需要自己写一个json处理器,然后创建文件 src/main/resources/META-INF/seata/io.seata.rm.datasource.undo.parser.spi.JacksonSerializer,把json处理器的全名写到文件中。
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import io.seata.rm.datasource.undo.parser.spi.JacksonSerializer;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class JsonDateTimeSerializer implements JacksonSerializer {

    private static final DateTimeFormatter DATETIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    @Override
    public Class type() {
        return LocalDateTime.class;
    }

    @Override
    public JsonSerializer ser() {
        return new LocalDateTimeSerializer(DATETIME_FORMAT);
    }

    @Override
    public JsonDeserializer deser() {
        return new LocalDateTimeDeserializer(DATETIME_FORMAT);
    }
}

  1. 分布式事务结束之前,事务外的线程不要修改数据。否则,回滚操作会失败。回滚操作会用undo_log的after_image校验数据。
  2. 事务中出现异常不能吞掉,要抛出来。否则不会回滚。

你可能感兴趣的:(seata踩坑)