- 论坛徽章:
- 0
|
找到答案
原文:http://q.163.com/lovejava/blog/m ... 6618920077210334379
相关问题:
数据库同步之后,随之而来的问题就是,如果数据库里每个表都是以自增ID为主键的话(oracle的自增字段为序列+触发器实现),而我们只设置表同步,序列是没有办法进行同步的,而序列是只要查询一次就会自增加1,如果sh数据插入一条不成功,而第二第成功的话,就会形成ID不一致现象,如下所示:
sh bj
表t_a,序列se_a,下一ID:1120 表t_a,序列se_a,下一ID:1120
插入失败:se_a也会+1为1121 而数据不成功也就不同步,bj还是1120
第二次插入成功:se_a+1为1122 数据成功同步,bj的se_a+1 为:1121
这样也就形成了北京和上海数据同步而ID不一致,如果你的表中使用了clob字段,这样的话clob字段也会为影响为null,
解决方案为:如果sh为主库,bj为负库,也就是说这个t_a的表只有上海为插入删除操作,北京只是查询,最简单的就是把北京的序列的触发器册除,即可;如果上海和北京都对t_a表都有插入删除操作,也就是双向同步,那就要使上海和北京的ID序列不一样就行,如北京以1开始,而上海以 900000001开始,再修改触发器:
原触发器为:select se_a.nextval into:new.id from dual;
修改为:if :new.id is null then
select se_a.nextval into:new.id from dual;
end if;
即可; |
|