奇葩问题

chuzhaowei 2016-09-05 09:17:38

insert into t1(f1,f2) values(v1,v2);
update t2 set f3=f3+1 where pk=id;


往 t1 表插入一条明细记录时,同时将 t2 表中的计数字段 f3 加 1,2个dml语句在同一个事务中执行。
在本机的测试环境一切都正常
发布到生产环境中,访问比较集中的时候,会出现 t1 表中的记录数比 t2 表中的计数值大
请高手帮忙分析一下,这是什么原因操作的,谢谢!
...全文
705 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianlang_2008 2016-09-13
  • 打赏
  • 举报
回复
id从它在plsql中的颜色来看,貌似是个关键字,估计你的这个问题可能和它有关
jdsnhan 2016-09-07
  • 打赏
  • 举报
回复
在t1表中增加一个类似PK的字段,再与t2同步比较看结果
cnwz 2016-09-07
  • 打赏
  • 举报
回复
可能是事务1还没有结束,同一个ID又有INSERT T1和UPDATE T2发生,此时事务2会等待事务1结束。 事务1提交后,事务2会执行INSERT和UPDATE,并提交。 整个逻辑上貌似没有问题,但是INSERT执行了2次,UPDATE后面的 F3+1的F3可能值相同,如这样,就会导致T2比T1少的情况。 改用触发器吧
bw555 2016-09-07
  • 打赏
  • 举报
回复
使用事务机制提交吧,大多数语言都支持数据的事务机制的,你使用的是什么编程语言调用的 可以考虑使用select for update nowait的方式先将记录锁住,然后执行操作,最后commit释放锁
chengccy 2016-09-06
  • 打赏
  • 举报
回复
建议改用触发器
mayanzs 2016-09-06
  • 打赏
  • 举报
回复
兴许访问比较集中的时候出现时间差,既然update操作依赖于insert操作,为何不直接做成触发器呢?
chuzhaowei 2016-09-05
  • 打赏
  • 举报
回复


整个系统中,只有这一个地方有这样的操作逻辑。
t1 和 t2 有主外键关系的,所以 "pk=id"条件肯定都是成立的。
不写代码的钦 2016-09-05
  • 打赏
  • 举报
回复
1 insert into t1(f1,f2) values(v1,v2);
2 update t2 set f3=f3+1 where pk=id;

第2条update中"pk=id"条件不满足这种情况有没有算进去??
卖水果的net 2016-09-05
  • 打赏
  • 举报
回复
会出现 t1 表中的记录数比 t2 表中的计数值大 这个应该是有的程序段没有更新 t2 ; 不妨在两张表上都建一个触发器,用来记录一下,看看什么样的数据,只写了 t1 而没有更新 t2;

17,082

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧