获取MYSQL中第一个未锁定的行

获取MYSQL中第一个未锁定的行,mysql,locking,race-condition,Mysql,Locking,Race Condition,当有人访问我的网站时,他会看到浏览量最少的页面。所有页面,包括一个pageview计数器,都存储在MYSQL数据库中。 如果查看页面,则页面浏览计数器将增加1 如果我的Web服务器有多个线程,我现在会遇到竞速情况: 线程1:用户A检索pageview计数为10的页面p 线程2:用户B检索页面浏览计数为10的页面P 线程1:P页的页面浏览次数从10增加到11并保存 线程2:P页的页面浏览次数从10增加到11并保存 所以在最后,页面被浏览了两次,但是页面计数器只增加了一次 一个解决方案是通过使用SE

当有人访问我的网站时,他会看到浏览量最少的页面。所有页面,包括一个pageview计数器,都存储在MYSQL数据库中。 如果查看页面,则页面浏览计数器将增加1

如果我的Web服务器有多个线程,我现在会遇到竞速情况:

线程1:用户A检索pageview计数为10的页面p
线程2:用户B检索页面浏览计数为10的页面P
线程1:P页的页面浏览次数从10增加到11并保存
线程2:P页的页面浏览次数从10增加到11并保存

所以在最后,页面被浏览了两次,但是页面计数器只增加了一次

一个解决方案是通过使用SELECT。。。然而,对于更新,用户B必须等到保存了用户A正在访问的记录,并且由于许多线程都试图以最少的页面浏览量获取页面,因此会有延迟

那么我的问题是:当许多行被锁定时,是否有可能获得第一行未被锁定,这样线程就不必互相等待?在MYSQL中如何做到这一点

我更喜欢一种解决方案,其结果是:

线程1:用户A锁定页面p,页面浏览次数为10
线程2:用户B锁定页面浏览计数为11的页面Q(因为页面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

然后,您不需要在多个查询中锁定行,这样您想要解决的问题就消失了。

这确实会让三个访问者同时到达并都看到p页的可能性大大降低,也不太重要,而他们中至少有一个应该看到Q.+1页,即使我吹毛求疵。