日期:2014-05-17  浏览次数:20768 次

asp-sql问题,
我有2个页面,一个页面add.asp对表user的字段num加1,另一页面sub.asp对表user的字段num减1
num原来为100
add.asp:
num=0
updsql="update user set num=num+1 where id="&id
do while num=0
  conn.execute updsql,num,&H0001
loop

sub.asp:
sql="update user set num=num-1 where id="&id
num=0
do while num=0
  conn.execute sql,num,&H0001
loop

num原来为100,经过100次add.asp和100次sub.asp(有可能同时访问),正常情况下,num最后值为100,可最后结果却不是,这是哪里问题?

------解决方案--------------------
这就是访问一些允许同时并发读取数据库数量较多的数据库容易产生的问题.

只要是恰巧非常同时地访问,那么执行时,都取出同样的值,比如100,然后一个加1成了101,另一个减1成了99,同时紧接着回写到数据库里,结果不是101就是99(看哪个页面被人执行得稍晚一点点了).

所以不是ADD覆盖了SUB的结果,就是SUB覆盖了ADD的结果,最后很可能不如所愿是情理之中的,但具体结果肯定是在意料之外,根据操作情况,谁也无法预先说准它会变成什么,只能说是区间在0到200之间的随机数.

要避免这个,需要给数据库加锁.具体的方法根据你所用的数据库而定,可以自己查阅一下数据库的联机帮助或搜索相应教程.