我在一进销存项目中因为进出数很频繁
而且还经常几个用户同时进出加减物料数量
我用的是update foodmain set foodstock = foodstock + 5 where foodid = '123456' and foodimg = '7031'
这条语句来修改物料库存,foodid 是物料编号, foodimg  是用户名
请问对项目和SQL数据库来说会不会有对数据的修改有准确性的影响

解决方案 »

  1.   

    --实际测试,假如有表tb,数据如下
    select * from tb
    /*
    id          username   paymentdate             amount
    ----------- ---------- ----------------------- ---------------------------------------
    1           aaa        2010-07-01 00:00:00.000 2.00
    2           bbb        2010-07-02 00:00:00.000 4.00
    */--一个连接执行如下操作,循环amount=amount+5,并输出更新后的值
    declare @amount decimal(12,2)
    while 1=1
    begin
    update tb set amount=amount+5 where id=1
    select @amount = amount from tb where id=1
    print @amount
    end/*(1 行受影响)
    7.00(1 行受影响)
    12.00(1 行受影响)
    17.00
    .......
    (1 行受影响)
    1702.00(1 行受影响)
    1707.00(1 行受影响)
    1712.00(1 行受影响)
    1717.00(1 行受影响) <--------------从这里开始第二个更新开始了,所以每次打印看到变成了+2
    1722.00(1 行受影响)
    1724.00(1 行受影响)
    1726.00
    */--一个连接执行如下操作,循环amount=amount-3,并输出更新后的值
    declare @amount decimal(12,2)
    while 1=1
    begin
    update tb set amount=amount-3 where id=1
    select @amount = amount from tb where id=1
    print @amount
    end--结果看,虽然是-3,但是第一个更新+5,所以打印得到+2的结果
    /*
    (1 行受影响)
    1719.00(1 行受影响)
    1721.00(1 行受影响)
    1723.00(1 行受影响)
    1725.00(1 行受影响)
    */
      

  2.   

    使用事务
    begin transaction
    commit trans
    rollback trans能不能有效控制这个数据不一致的问题
      

  3.   

    update foodmain set foodstock = foodstock + 5 where foodid = '123456' and foodimg = '7031'
    如果只有这一个语句修改数据,那它本身就是隐式事务。
    产生数据不一致的几个诱因
    丢失修改
    读脏数据
    不可重复读
    幻影读得
    也不存在产生这些问题的情况。在foodmain表上增加索引(foodid,foodimg),可以缩小锁的粒度,增加并发性。LZ最好把事务、并发控制相关内容好好理解一下。
      

  4.   


    2# 已经给你演示了只进行update的操作及结果了。 使用事务可以保证数据的一致性,选用什么隔离级别要看业务需要。
      

  5.   


    《SQL Server 2005技术内幕》