2014-09-24 50 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」條款的註釋。