Oracle自增字段出现的问题
来源:百度知道 编辑:UC知道 时间:2024/05/24 18:35:19
问题描述:
在数据库中有一个表A,我在表A创建了一个Before Update For Each Row的触发器,在A表进行更新A表某字段操作时,记录数据到表B,B表有id(自增序列),和updatetime字段以及其他信息字段,触发器写B表语句如下:
insert b(id,updatetime,....) select seq_B.nextval,sysdate...from dual;
除此处之外,没有任何其他地方操作B表,按照逻辑,B表记录应该id值大的,updatetime时间一定靠后,但现在出现id值大的,updatetime 靠前,每天都随机出现几条到几十条这样的数据。B表是第三方软件按照记录上次最大id值进行定时增量读取的,这样经常性出现漏掉数据的情况。
系统现状:
1、A表还存在大量触发器,不过BU类型的仅有这个触发器,其他触发器处理逻辑复杂,但与B表无关。
2、并行度很大,经常数十个进程同时进行A表的更新操作。
3、排除有人手工修改B表,和系统时间的可能。
这个问题困扰我好几天了,实在找不出原因,请教一下高手,这种情况可能的原因是什么?谢谢了。
1、感谢二位关注,to tj_angela:updatedatetime 不是事务提交才写的,是和id值同一条语句写的,而且是在插入语句中写sysdate值:现在的数据表现是会随机出现updatetime早的,id值更大,所以不是您说的这种情况。
2、to 抽屉83 :没有使用rac
在数据库中有一个表A,我在表A创建了一个Before Update For Each Row的触发器,在A表进行更新A表某字段操作时,记录数据到表B,B表有id(自增序列),和updatetime字段以及其他信息字段,触发器写B表语句如下:
insert b(id,updatetime,....) select seq_B.nextval,sysdate...from dual;
除此处之外,没有任何其他地方操作B表,按照逻辑,B表记录应该id值大的,updatetime时间一定靠后,但现在出现id值大的,updatetime 靠前,每天都随机出现几条到几十条这样的数据。B表是第三方软件按照记录上次最大id值进行定时增量读取的,这样经常性出现漏掉数据的情况。
系统现状:
1、A表还存在大量触发器,不过BU类型的仅有这个触发器,其他触发器处理逻辑复杂,但与B表无关。
2、并行度很大,经常数十个进程同时进行A表的更新操作。
3、排除有人手工修改B表,和系统时间的可能。
这个问题困扰我好几天了,实在找不出原因,请教一下高手,这种情况可能的原因是什么?谢谢了。
1、感谢二位关注,to tj_angela:updatedatetime 不是事务提交才写的,是和id值同一条语句写的,而且是在插入语句中写sysdate值:现在的数据表现是会随机出现updatetime早的,id值更大,所以不是您说的这种情况。
2、to 抽屉83 :没有使用rac
比如有一种情况,此时id为100
A连上后插入一条,此时id为101
但是他没有及时commit;
B连上插入一条记录,此时id为102,并commit
这是你能看到的是id=100后面的一条是id=102
这时Acommit,你再查
结果就是100,102,101
关注!
你是不是RAC数据库啊,
alter sequence seq_B nocache order;
不过这样会有降低并行度,影响性能的!