如果满足条件,请选择,检查并插入

时间:2017-03-08 19:58:22

标签: sql database mariadb

我有以下表格:Tour,Customer,TourCustomerXRef。假设每个巡回赛都有一个容量上限。现在请求到达后端进行预订。

我需要做的是:

  1. SELECT和count()TourC = =
  2. 的TourCustomerXRef中的所有条目
  3. 在程序代码(或查询?)中:如果count()<帽
    1. True: INSERT到TourCustomerXRef,返回成功
    2. 错误:返回错误
  4. 但是,后端api可能同时被调用。这可能导致SELECT语句返回最大值下的数字。容量两次,导致INSERT被执行多次(即使只剩下一个地方)。

    对于上述案例,最好的预防措施是什么?设置事务隔离级别可序列化?还是可重复阅读?

    我担心应用程序逻辑(即使它只是一个简单的if)可能会损害性能,因为读取和写入锁定不允许api执行只想在不插入任何内容的情况下选择数据的查询, ?

    (使用mariaDB)

1 个答案:

答案 0 :(得分:2)

您可以尝试在SELECT(mysql示例)中使用锁定提示“FOR UPDATE”:

BEGIN TRANSACTION;
SELECT * FROM TourCustomerXRef FOR UPDATE WHERE ...;
INSERT ...;
COMMIT;