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 表中的计数值大
请高手帮忙分析一下,这是什么原因操作的,谢谢!

解决方案 »

  1.   

    会出现  t1 表中的记录数比 t2 表中的计数值大这个应该是有的程序段没有更新 t2 ; 不妨在两张表上都建一个触发器,用来记录一下,看看什么样的数据,只写了 t1 而没有更新 t2; 
      

  2.   

    1 insert into t1(f1,f2) values(v1,v2);
    2 update t2 set f3=f3+1 where pk=id;第2条update中"pk=id"条件不满足这种情况有没有算进去??
      

  3.   

    整个系统中,只有这一个地方有这样的操作逻辑。
    t1 和 t2 有主外键关系的,所以 "pk=id"条件肯定都是成立的。
      

  4.   

    兴许访问比较集中的时候出现时间差,既然update操作依赖于insert操作,为何不直接做成触发器呢?
      

  5.   

    可能是事务1还没有结束,同一个ID又有INSERT T1和UPDATE T2发生,此时事务2会等待事务1结束。
    事务1提交后,事务2会执行INSERT和UPDATE,并提交。
    整个逻辑上貌似没有问题,但是INSERT执行了2次,UPDATE后面的 F3+1的F3可能值相同,如这样,就会导致T2比T1少的情况。改用触发器吧
      

  6.   

    在t1表中增加一个类似PK的字段,再与t2同步比较看结果
      

  7.   

    使用事务机制提交吧,大多数语言都支持数据的事务机制的,你使用的是什么编程语言调用的可以考虑使用select for update nowait的方式先将记录锁住,然后执行操作,最后commit释放锁
      

  8.   

    id从它在plsql中的颜色来看,貌似是个关键字,估计你的这个问题可能和它有关