我做了个测试:
机器A和机器B上同时打开一个表,并取出表中的一条记录,这条记录有三个字段,一个为关键的ID,另外两个是需要修改的。
在机器A上修改了ColA,机器B上修改了ColB,然后提交保存,结果发现有一个并没有保存上。查看了日志,发现以下语句:
UPDATE T1
   SET ColB='1'
 WHERE ID='297196'然后另外一条是:
UPDATE T1
   SET ColA='1',
       ColB=NULL
 WHERE ID='297196'看了才知道,原来先修改的ColB的值被后面的给替换了,但有个问题,在修改的时候,确实是一个修改ColA,另外一个修改了ColB的呀,为什么第二条日志会出现ColB=NULL呢?
请大家帮忙看看哈,谢谢了。

解决方案 »

  1.   

    在ColB值对应的变量前后设置断点,用F7或F8调试看看执行到update语名时colB获取的值倒底是什么(鼠标放在变量上即可显示变量的当前值)?是不是Null。如是Null,则说明获取ColB值时出了问题,不是执行update语句的问题。
      

  2.   

    取出表中的一条记录,这条记录会保留在内存中,虽然机器A上已经修改,但机器B中该条记录仍然是内存中的数据,并不是实时的,所以你colB还是最初未修改时的数据,除非update前先select一下,取得最新的数据
      

  3.   

    bdmh :你说的和我想的差不多,但你说的解决办法还是觉得有点点问题。
    如果在select的同时,另外一个正在update,结果又会如何呢?
      

  4.   

    UPDATE T1 
      SET ColA='1' --, 
          --ColB=NULL --把这个更新去掉
    WHERE ID='297196' 
      

  5.   

    那样你是不是可以用两个进程控制两个更新呢,一个更新完毕后,通知另一个更新,另一个更新先select然后update,完毕后可以通知第一个更新,如此反复
      

  6.   


    这个是数据库生成的SQL语句,没法去掉呀。
    保存数据是用的数据感知控件。
      

  7.   

    但要解决你的矛盾,不用点办法是不行的,因为数据库并发问题就是比较罗嗦,要解决你这个问题,就必须知道你的数据是否已经更改,如果已经更改,就要重新取得再有,你就是自己写sql语句,更新字段不要有重复,你取出记录后,只需知道一个ID即可,根据ID去update,应该不会有问题
      

  8.   

    是的。
    我觉得即使是自己写SQL语句的话,也有这个问题。
    首先两人都取出的是没有修改过的数据一个修改A列,一人修改同条记录的B列,
    最后更新的SQL语句肯定是要包含两列的。那么写回的时候,肯定会有覆盖问题。