2014-09-24 54 views
0
<?php 
    $time=getdate(); 
    $time['month']; 
    $temp_time=$time['month']." ".$time['year']; 
    $q="SELECT * FROM websiteviews ORDER BY id DESC LIMIT 1"; 
    $r=mysqli_query($dbc, $q); 
    $r=mysqli_fetch_assoc($r); 
    if($temp_time==$r['timespan']){ 
     $count=$r['view']+1; 
     $q="UPDATE websiteviews SET view='".$count."' WHERE id='".$r['id']."'"; 
     mysqli_query($dbc, $q); 
     echo mysqli_error($dbc); 
    } 
    ?> 

嗨朋友我每次更新网页时都更新我的网站的页面浏览量 这段代码现在放在网页的顶部我的问题是这种机制可能会导致竞争状态我想锁定我的行直到它是更新请帮助MySQL查询锁定特定的行,直到它被更新如何实现mysql表行的锁定机制以避免竞争状态?

+0

如果你使用mysqli,你应该使用准备好的语句 – Stony 2014-09-24 12:59:31

+0

什么是表类型? – 2014-09-24 13:02:54

+0

innoDB上的表类型为utf-8 – user3787783 2014-09-24 13:11:39

回答

1

你应该不选择然后更新你想更新的记录。

UPDATE 
    websiteviews 
SET 
    view = view+1 
WHERE 
    -- Assuming 'timespan' is a varchar column and the stored format is 'MM YYYY' 
    timespan = DATE_FORMAT(NOW(), '%m %Y') 

上述查询在一个步骤中更新记录,所以竞争条件可以由DBMS处理。可能您应该更改WHERE条件以符合您的要求。

如果列view为空,则SET部分更改为view = COALESCE(view, 0)+1

存储引擎

在MySQL表中可以通过不同的存储引擎进行存储和所有的引擎都具有不同的支持锁定(如果有的话)。

其他资源:About locking when InnoDB is the storage engine

0

你可以用交易来解决竞争条件,类似下面:

START TRANSACTION; 
SELECT view, id FROM websiteviews ORDER BY id DESC LIMIT 1 FOR UPDATE; 

#id obtained from previous step 
#view obtained from previous step 
UPDATE websiteviews SET `view`=<view>+1 WHERE id= <id>; 
COMMIT; 

注:请用select语句中使用“FOR UPDATE”条款的注释。