【问题标题】:How to implement locking mechanism for mysql table row to avoide race condition?如何为mysql表行实现锁定机制以避免竞争条件?
【发布时间】:2014-09-24 12:56:27
【问题描述】:
    <?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 查询锁定特定行直到它被更新

【问题讨论】:

  • 如果你使用mysqli,你真的应该使用准备好的语句
  • 什么是表类型?
  • innoDB 上的表类型是 utf-8
  • @user3787783 只是为了澄清utf-8Character Set,不是表类型,它仅适用于那些存储字符数据的列。 Storage Engine 处理数据如何存储(持久化)。 Storage Engine 可以由 ENGINETYPE 关键字指定。支持 TYPE 关键字以实现向后兼容性。 (从版本3.23.04.0.18 只有TYPE 关键字可用。TYPE 关键字现在已弃用。)

标签: php mysql


【解决方案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

【讨论】:

    【解决方案2】:

    我认为您需要使用事务锁定,但您的表需要使用支持 InnoDB 等事务的引擎

    您可以阅读更多内容

    【讨论】:

      【解决方案3】:

      您可以使用事务来解决竞争条件,如下所示:

      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”子句。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-12
        • 1970-01-01
        • 2018-12-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多