我在一进销存项目中因为进出数很频繁
而且还经常几个用户同时进出加减物料数量
我用的是update foodmain set foodstock = foodstock + 5 where foodid = '123456' and foodimg = '7031'
这条语句来修改物料库存,foodid 是物料编号, foodimg 是用户名
请问对项目和SQL数据库来说会不会有对数据的修改有准确性的影响
而且还经常几个用户同时进出加减物料数量
我用的是update foodmain set foodstock = foodstock + 5 where foodid = '123456' and foodimg = '7031'
这条语句来修改物料库存,foodid 是物料编号, foodimg 是用户名
请问对项目和SQL数据库来说会不会有对数据的修改有准确性的影响
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 行受影响)
*/
begin transaction
commit trans
rollback trans能不能有效控制这个数据不一致的问题
如果只有这一个语句修改数据,那它本身就是隐式事务。
产生数据不一致的几个诱因
丢失修改
读脏数据
不可重复读
幻影读得
也不存在产生这些问题的情况。在foodmain表上增加索引(foodid,foodimg),可以缩小锁的粒度,增加并发性。LZ最好把事务、并发控制相关内容好好理解一下。
2# 已经给你演示了只进行update的操作及结果了。 使用事务可以保证数据的一致性,选用什么隔离级别要看业务需要。
《SQL Server 2005技术内幕》