asp+SQL 超时已过期错误,求解决办法,万分感谢!!!!!!!

ysw8u8 2008-06-20 01:04:24
Beilv=10 '倍率
Set rs=server.CreateObject("adodb.recordset")
Rs.open "select UserID,Point,IsOper from LuckJoin where NumID=1000",conn,1,3
If not Rs.eof then
Do while not Rs.eof
UserID=rs("UserID") '用户ID
UserLuckPoint=Rs("Point") '积分
MyPrizePoint=UserLuckPoint*Beilv '应获得积分

'将积分写入用户表
conn.execute("update UserList Set UserPoint=UserPoint+"&MyPrizePoint&" where UserID="&UserID)

rs("IsOper")=2 '标记已经运行,避免程序错误等引起的漏操作。
rs.update()
rs.movenext
loop
End If
rs.close
set rs=nothing

以上代码是没有什么错误的,LuckJoin表数据少的时候,一般不会出现问题,但这张表数据达到几十万条时,有时会出现问题,有时一天出现一次,有时一天能出现两三次,错误是这样的:如下:


Microsoft OLE DB Provider for SQL Server 错误 '80040e31'

超时已过期

/System/LuckJoin.asp,行 119


第 119 行是:conn.execute("update UserList Set UserPoint=UserPoint+"&MyPrizePoint&" where UserID="&UserID)

我在网上找了一下,是这个问题:是 conn.CommandTimeout 没设好,默认情况下 conn.CommandTimeout 的值为30秒,我把这个值改成200秒,问题出现就少了,但还会出问题,报同样的错,
还是119行的错,也就是说,200秒一直在等待执行119行的代码,我在分析,肯定是出现死锁了,所以才导致一直等待。不知高手们有没有解决方法,死锁这个问题,我一直很头疼,一直没有
更好的解决方法,所以到网上来求救来了,请高手指点,谢谢!

这样不知能不能做到,但代码我不会写,我想把这两张表更新代码写成两个命令,都用 conn.execute 来完成,不知能不能实现,如下:

conn.execute("update LuckJoin Set IsOper=2 where NumID=1000")
conn.execute("update UserList Set UserPoint=UserPoint+??? where UserID in(select UserID from LuckJoin where IsOper=2 and NumID=1000)")

"???"处代码怎么写?我是不会了,可能这样根本就不可能实现,别无他法,想不出好的解决方法,请高手指点,谢谢!
...全文
382 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
jopch 2011-07-06
  • 打赏
  • 举报
回复
我的也超时过期了,如何处理,待解
Garnett_KG 2008-06-20
  • 打赏
  • 举报
回复
lZ的循环是可以不用的。
改成用sql直接update就行了。

nzperfect 2008-06-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ysw8u8 的回复:]
其实所有的死锁最深层的原因就是一个:资源竞争
一个用户A 访问表A(锁住了表A),然后又访问表B
另一个用户B 访问表B(锁住了表B),然后企图访问表A
这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B,才能继续,好了他老人家就只好老老实实在这等了
同样用户B要等用户A释放表A才能继续这就死锁了

解决方法:
这种死锁是由于你的程序的BUG产生的,除了调整你的程序的逻辑别无他法
仔细分析你程序的逻辑,
1:尽量避免同时锁定两个资源
2: 必须同时锁定两个资源时,要保证在任何时刻都应该按照相同的顺序来锁定资源.
[/Quote]

你这个不是死锁。因为你没有事务,而且是顺序执行,有可能是userid没有索引造成的。
nzperfect 2008-06-20
  • 打赏
  • 举报
回复
create index idx_01 on UserList (UserID)
create index idx_01 on LuckJoin (UserID)

nzperfect 2008-06-20
  • 打赏
  • 举报
回复
给这两个表的UserID都加上索引试试看
jacklinchen 2008-06-20
  • 打赏
  • 举报
回复
conn.execute("update UserList Set UserPoint=UserPoint+UserLuckPoint*"&Beilv&" where UserID in(select UserID from LuckJoin where IsOper=2 and NumID=1000)")


'将积分写入用户表
conn.execute("update UserList Set UserPoint=UserPoint+"&MyPrizePoint&" where UserID="&UserID&" ; update LuckJoin set IsOper=2 where Userid=" & UserId)
'rs("IsOper")=2 '标记已经运行,避免程序错误等引起的漏操作。
'rs.update()


ysw8u8 2008-06-20
  • 打赏
  • 举报
回复
怎么现在没人关注了,高手们,帮忙啊!
ysw8u8 2008-06-20
  • 打赏
  • 举报
回复
楼上几位,谢谢你们的关注,谢谢你们的回答!

1楼的回复:我的服务器一点也不差,刚配的,配置如下:CPU两个,每个都是4核的,型号是Intel X5430 2.66G 总线1333 ,L2 12M,一个CPU5000元差不多,内存是金士顿的,每根2G,一共4根,合8G,硬盘:希捷146G,15000转/分,主板:华硕 DSBV—DX/SAS,别的就不用说了!这个配置不算差。

2楼的回复:等待时间太长了,我的程序不可能要等那么久,200秒已经是极限了,如果不考虑这个,我可能改成不限时,想锁多久就锁多久。

3楼的回复:UserId不是LuckJoin的主键,所以死锁问题还会存在的,我现在更新这两张表,我同时占用两个资源,一个是LuckJoin,另一个是UserList,如果分开写就好了,同时只占一个资源。

其实所有的死锁最深层的原因就是一个:资源竞争
一个用户A 访问表A(锁住了表A),然后又访问表B
另一个用户B 访问表B(锁住了表B),然后企图访问表A
这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B,才能继续,好了他老人家就只好老老实实在这等了
同样用户B要等用户A释放表A才能继续这就死锁了

解决方法:
这种死锁是由于你的程序的BUG产生的,除了调整你的程序的逻辑别无他法
仔细分析你程序的逻辑,
1:尽量避免同时锁定两个资源
2: 必须同时锁定两个资源时,要保证在任何时刻都应该按照相同的顺序来锁定资源.
nzperfect 2008-06-20
  • 打赏
  • 举报
回复
如果UserId是LuckJoin的主键,可以这样改试试
<%
Beilv=10 '倍率
Set rs=server.CreateObject("adodb.recordset")
Rs.open "select UserID,Point,IsOper from LuckJoin where NumID=1000",conn,1,1
If not Rs.eof then
Do while not Rs.eof
UserID=rs("UserID") '用户ID
UserLuckPoint=Rs("Point") '积分
MyPrizePoint=UserLuckPoint*Beilv '应获得积分

'将积分写入用户表
conn.execute("update UserList Set UserPoint=UserPoint+"&MyPrizePoint&" where UserID="&UserID&";update LuckJoin set IsOper=2 where Userid=" & UserId)

rem rs("IsOper")=2 '标记已经运行,避免程序错误等引起的漏操作。
rem rs.update()
rs.movenext
loop
End If
rs.close
set rs=nothing
%>
nzperfect 2008-06-20
  • 打赏
  • 举报
回复
把200秒设置成600S
懒牛科技 2008-06-20
  • 打赏
  • 举报
回复
超时 ,不是你sql语句的问题.就是机器配置太差

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧