浏览主题:????????京京?s网????s网???s网i音?京京???
主题:????????京京?s网????s网???s网i音?京京???
|
表NewsVisit用来记录文章的每天访问量,现在约有370万的记录
SP sp_insert_newsvisit是用来插入录的存储过程 在sql server管理里查看锁/对象,属性,上批TSQL命令,主要是这个SP和sp_cursorclose;1 查了一些资料,不得要领 /* 插入新闻浏览记录 输入:表名 新闻ID,新闻标题 by berk */ CREATE PROCEDURE sp_insert_newsvisit ( @NewsID int, @NewsTitle varchar(1000) ) AS BEGIN DECLARE @s1 int,@s2 int SET @s1=DATEDIFF(dd,'1999-1-1',getdate()) Select @s2=count(visitid) From NewsVisit where Newsid=@NewsID and VisitDateNum=@s1 IF @s2 = 0 BEGIN Insert Into NewsVisit (NewsID,NewsTitle) Values (@NewsID,@NewsTitle) END Else BEGIN UPDATE NewsVisit SET ClickNum=ClickNum+1 Where Newsid=@NewsID and VisitDateNum=@s1 END END GO |
|
一、没看出来VisitDateNum值第一次是怎么插到表里的?
二、当你update一行数据时,锁由更新锁升级为独占锁,你根本不能对该行记录放置共享锁,所以你不能select出该行的数据。 三、典型的死锁就是你这么写出来的。同时对一行数据下共享锁,再同时要更新该数据企图升级至共享锁、独占锁。必然会死锁。 四、可以降低事务隔离等级(会牺牲精确性): CREATE PROCEDURE sp_insert_newsvisit ( @NewsID int, @NewsTitle varchar(1000) ) AS BEGIN DECLARE @s1 int,@s2 int SET @s1=DATEDIFF(dd,'1999-1-1',getdate()) IF EXISTS (SELECT * FROM NewsVisit(NOLOCK) WHERE Newsid=@NewsID and VisitDateNum=@s1) BEGIN UPDATE NewsVisit SET ClickNum=ClickNum+1 Where Newsid=@NewsID and VisitDateNum=@s1 END ELSE BEGIN Insert Into NewsVisit (NewsID,NewsTitle,ClickNum) Values (@NewsID,@NewsTitle,1) END END 最后一次由 完美行动 在 2006-10-7 18:03:09 编辑 |
|
顺便说一下:
WHERE条件中,至少应该有主键。 再顺便说一下: IF EXISTS (SELECT * FROM NewsVisit(NOLOCK) WHERE Newsid=@NewsID and VisitDateNum=@s1) 改成 IF EXISTS (SELECT * FROM NewsVisit(XLOCK,PAGLOCK) WHERE Newsid=@NewsID and VisitDateNum=@s1) 更好些。你自己拿主义吧。 最后一次由 完美行动 在 2006-10-7 18:44:19 编辑 |
|
这样得到的统计数据,有问题的
不管了,我现在单提到了一个文件,用<script src>,好多了 |
|
楼上的签名赞。。
|
|
将Newsid VisitDateNum 都建立索引 减低资源锁定时间
|
|
偶来学习呵呵 |