zoukankan      html  css  js  c++  java
  • MYSQL SELECT FOR UPDATE

    问题说明:

    最近遇到一个问题,多个WORKER同时向MYSQL数据库请求任务,如何实现互斥?例如:

    SELECT * FROM student WHERE id > 10 LIMIT 100;

    UPDATE student SET status = 1 WHERE id > 10 LIMIT 100;

    当有多个WORKER执行上面两条语句,那么很可能都执行同样的数据,造成线上问题,比如WORDER1执行SELECT之后,还没有执行UPDATE之前,WORDER2也执行了SELECT语句,造成问题。

    那么这种情况可以使用SELECT ... FOR UPDATE,解决问题,当我读出数据的时候,锁表,那么其他的WORDER也就不能使用了。举例来说明:

    1、建立测试表:

    CREATE TABLE `test` (
      `unit_id` int(11) NOT NULL AUTO_INCREMENT,
      `style` int(11) NOT NULL DEFAULT '0',
      PRIMARY KEY (`unit_id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8
    
    插入数据:
    insert into test values (1,8),(2,1),(3,1);

    2、测试:

    2.1 在A客户端执行:

    SET AUTOCOMMIT=0; BEGIN WORK;
    select unit_id,style from test where unit_id = 1 for update;
    mysql> select unit_id,style from test where unit_id = 1 for update;
    +---------+-------+
    | unit_id | style |
    +---------+-------+
    |       1 |     8 |
    +---------+-------+
    1 row in set (0.00 sec)

    2.2 在B客户端执行:

    mysql> select * from test where unit_id = 1 for update;
    
    ..........没有返回记录........

    2.3 情况说明:

      A客户端锁表成功,B客户端不能使用UPDATE进行类似修改的操作。注明 select from for update 必须在事务内才能生效。

  • 相关阅读:
    汇付 支付,痛苦的接入过程
    路由集合中已存在名为“ XXXX” 的路由
    博客目录
    (转载)为什么使用APP Bundle
    安卓基础:后台任务
    安卓基础:应用权限
    安卓资源的使用 二
    kotlin学习三:lambda 和内联函数
    kotlin学习二:函数
    kotlin学习一:基础语法
  • 原文地址:https://www.cnblogs.com/liqiu/p/3519649.html
Copyright © 2011-2022 走看看