这个原因是由于锁照成的,可以考虑将上面的事物分为两个单独的事物,分别是:
1、获取B表的当前最大的号,将最大号更新加一,返回获取的最大号。
2、根据返回的最大号更新A表的KEY!

解决方案 »

  1.   

    to:wudan8057,非常感谢!你说的不错,是在PB中调用的,不过我不太理解,你说的“尽量改在存储过程中执行”是何意?是指生成最大号的东西放在存储过程中执行吗?
      

  2.   

    --TRY
    SET XACT_ABORT ON;
    SET TRANSACTION LEVEL REPEATABLE READ;
    SELECT id INTO :ll_Id FROM B with (updlock)
       WHERE table_id=....;
    ll_NewId=ll_Id+1
    UPDATE B set id=:ll_NewId WHERE table_id=.... ;
    INSERT IN A VALUES(:ll_NewID, ...);
    COMMIT;
      

  3.   

    TO:wgsasd311谢谢!但似乎你那句update...with (updlock)好像只能防止别人更新,但不能防止别人读啊。
    “SET XACT_ABORT ON”我没用过,似乎是让事务任一错误能立即自动回滚,但是有出错信息返回吗?因为我的事务是在PB程序中统一控制、提交或回滚的,如果没有出错代码和出错信息返回,我的PB程序中的事务仍然会继续运行而不会返回啊。
      

  4.   

    谢谢,我准备采用wudan8057试一下,然后观察一阵子看看效果如何。