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 必须在事务内才能生效。

  • 相关阅读:
    在redhat 6.6上安装Docker
    Linux操作系统各版本ISO镜像下载(包括oracle linux edhatcentosu
    UML时序图(Sequence Diagram)学习笔记
    eureka 和zookeeper 区别 优势【转】
    HttpClient实现远程调用
    Java 1.8 Stream 用例测试
    ZooKeeper下载安装(Windows版本)
    Java1.8新特性
    mysql大数据量表索引与非索引对比
    druid监控mysql程序
  • 原文地址:https://www.cnblogs.com/liqiu/p/3519649.html
Copyright © 2011-2022 走看看