zoukankan      html  css  js  c++  java
  • 如何使用数据库实现多台服务器竞争资源的问题

    简单方法:

    处理过程分为三个步骤:

    1、从数据库查询一条状态为为用的记录(不同的数据库写法会不一样)

    select * from table1 where state = '未用' limit 1

    2、将数据状态更新为已用,如果更新成功(影响记录数为1表示成功)则表示获取数据成功,否则这条数据已经被其他服务器或线程所抢用。

    update table1 set state = '已用' where id='数据id' state = '未用';

    3、使用数据,如果未正常使用数据可将数据状态还原为未用

    升级方法:

    上面这个方法存在一个缺陷,假如获取数据后本服务器挂掉,会导致数据未正常处理,可以考虑另外一个方法处理:增加一个用于记录数据获取的表table2(table1_id(主键),guid(用于唯一标识获取数据放),expired(过期时间))

    1、从数据库查询一条状态为为用的记录,不同的数据库写法会不一样

    delete from table2 where expired <= '当前时间';(先删除过期的记录,可能获取方已挂掉)

    select * from table1 where state = '未用' and not exists(select * from table2 where table1_id = table1.id) limit 1;

    2、在table2插入一条数据表名本方已获取数据,如果插入成功(影响记录数为1,没有抛出主键冲突的异常)则表示获取数据成功,否则这条数据已经被其他服务器或线程所抢用。

    insert into table2 (...) values (记录的id,本方的唯一标识,当前时间+一个合理的值作为过期时间);  

    3、使用数据,如果正常使用数据则将数据状态更新为已用,并删除table2的记录

    update table1 set state = '已用' where id='数据id' state = '未用';

    delete from table2 where id=[id];

  • 相关阅读:
    关于python的类成员方法允许静态调用的机制
    一个pyqt5动态加载ui+多线程+信号刷新界面的例子
    一个经典的redis队列简单解决方案
    关于连表查询的执行计划
    electron nativefier打包网址 electron-winstaller制作安装包
    MySQL 8.0 字符串比较特殊案例小结
    MySQL SELECT_LEX与subselect 执行 源码阅读笔记
    MySQL 8.0 QueryResolver 源码笔记
    MySQL 8.0 Optimizer 源码笔记
    MySQL Item 源码阅读笔记
  • 原文地址:https://www.cnblogs.com/liqiu/p/4890748.html
Copyright © 2011-2022 走看看