UTS时间戳机制同步原理

时间戳(timestamp)是SqlServer特有的一个字段类型,当表的行数据新增或修改后,该字段会自动更新为最新的数值。

SqlServer的timestamp存储的其实是一个int64,并不是时间或者日期类型(比如mysql的timestamp)。

凡是数据新增和修改操作能引起数值变大的字段,我们都可以用于充当时间戳字段,包括bigint、number、datetime、binary(8)等。

工作原理

我们通过比对源和目标表中,所有时间戳字段的差异,就可以判断出源头发生了何种数据操作(DML)。 从而通过UTS时间戳机制自动进行数据库同步完善工作。

例如:我们现在有一个源表:

主键 name(varchar(20)) 时间戳(bigint)
Hello 1001
World 1003
  • 1、 源表数据库同步之后,得到目标表一:
主键 name(varchar(20)) 时间戳(bigint)
Hello 1001

对比目标表一和源表,发现缺少时间戳1003的记录,说明源表发生了insert新增操作(也有可能是目标误删除了记录);

  • 2、 源表数据库同步之后,得到目标表二:
主键 name(varchar(20)) 时间戳(bigint)
Hello 1001
World 1002

对比目标表一和源表,目标表二多了一条时间戳1002的数据,但少了一条1003的数据,两者主键一致,说明源表发生了update更新操作;

  • 3、 源表数据库同步之后,得到目标表三:
主键 name(varchar(20)) 时间戳(bigint)
Hello 1001
World 1003
Test 1004

对比目标表一和源表,目标表三比源表多了一条时间戳为1004的数据,说明源头发生了delete删除操作。


以上种种情形,我们通过时间戳服务,对比源表和目标表时间戳序列的差异,随时发现数据DML操作,不需要额外的日志系统辅助,自动智能解决一切传输问题,传给目标表精确的数据库。

[!TIP] 时间戳字段应当满足如下特性:

1、时间戳字段的值必须是正数,且像时间一样正向增长的,不能回退;

2、同一张表中时间戳字段的值尽可能的是唯一的;

3、数据发生插入或更新时,该条记录的时间戳字段的值尽可能成为全表最大。


MSSQL数据的timestamp类型就具有这种特性,能够很好的支持UTS的数据传输同步。而对于数据源不是MSSQL数据库的,尽可能使用某种机制确保作为时间戳字段的值满足上述特性。(如触发器的实现方式)

results matching ""

    No results matching ""