- 如果表使用了自增主键,不要使用tkmybatis做insert操作。会导致seata无法拿到新数据的id,无法生成undo_log
- 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<LocalDateTime> {
private static final DateTimeFormatter DATETIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@Override
public Class<LocalDateTime> type() {
return LocalDateTime.class;
}
@Override
public JsonSerializer<LocalDateTime> ser() {
return new LocalDateTimeSerializer(DATETIME_FORMAT);
}
@Override
public JsonDeserializer<? extends LocalDateTime> deser() {
return new LocalDateTimeDeserializer(DATETIME_FORMAT);
}
}
- 分布式事务结束之前,事务外的线程不要修改数据。否则,回滚操作会失败。回滚操作会用undo_log的after_image校验数据。
- 事务中出现异常不能吞掉,要抛出来。否则不会回滚。