当有人访问我的网站,他会看到页面浏览量用最少。所有页面,包括网页浏览计数器,存储在MySQL数据库。 如果页面被观察时,网页浏览计数器增加一。

我现在碰上了赛车状况,如果我的web服务器有一个以上的线程:

  

主题1:用户A检索纸P与10,点击网页浏览数   主题2:用户B retreives纸P用的10点击浏览量计数   主题1:页面P的页面浏览数量从10个增加到11并保存结果   线程2:页P的网页浏览计数从10增加至11,并保存结果

因此,在结束时,网页被浏览的两倍,但在pagecounter仅增加一。

一个解决方案是使用SELECT ... FOR UPDATE然而,然后锁定该行,用户B必须等待,直到记录用户A在访问被保存并与许多线程都试图获得与浏览量最少的页面,将有一延迟。

所以我的问题:是否有可能在多个行被锁定,让未锁定第一行,所以线程不必等待对方如何做这MYSQL?

我宁愿这导致溶液:

  

主题1:用户A锁纸P与10,点击网页浏览数   主题2:用户B锁页Q随11(因为页面P被锁定)点击浏览量计数   主题1:页面P的页面浏览数量从10个增加到11并保存结果   线程2:页Q的网页浏览计数从11增加至12,并保存结果

有帮助吗?

解决方案

我猜你正在做的事情是这样的:

 UPDATE Pages SET PageView = 11 WHERE Id = 30

其中常数11和30分别通过代码插入(PHP?)

一个更好的方法是做到这一点:

 UPDATE Pages SET PageView = PageView + 1 WHERE Id = 30

那么你不应该需要锁定整个所以这个问题要解决消失多个查询的行。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top