【问题标题】:How to avoid concurrent problem in back-end when select-then-update from MySQL从 MySQL select-then-update 时如何避免后端并发问题
【发布时间】:2023-01-07 19:27:32
【问题描述】:

我正在使用 Java 和 MySQL。我有一张桌子:

create table serial_number (
    id int not null primary key auto_increment, -- PK
    sn int, -- The serial number
    available tinyint   -- 0: unavailable; 1: available
);

这是场景:

  • SELECT id, sn FROM serial_number WHERE available = 1 limit 1; -- assume the id is 1
  • UPDATE serial_number SET available = 0 WHERE id = 1;
  • 将序列号(sn)用于其他业务。

如何避免并发问题?

【问题讨论】:

  • 你的问题太含糊了。你到底想知道什么?什么是“对其他业务”,对你来说什么是“并发问题”?详细展示和解释必须解决的真实、具体的问题,而不是这种毫无意义的描述。

标签: mysql sql database-concurrency


【解决方案1】:

您需要使用悲观锁定或乐观锁定。

  1. 悲观
    SELECT ... FOR UPDATE
    UPDATE ... SET... WHERE
    
    1. 乐观
    SELECT id, sn FROM serial_number WHERE available = 1 limit 1; -- assume the id is 1
    UPDATE serial_number SET available = 0 WHERE id = 1 and available = 1;
    

【讨论】:

    猜你喜欢
    • 2014-03-02
    • 1970-01-01
    • 2011-01-30
    • 2015-05-09
    • 1970-01-01
    • 2011-02-02
    • 2018-10-26
    • 1970-01-01
    相关资源
    最近更新 更多