我有以下表格:Tour,Customer,TourCustomerXRef。假设每个巡回赛都有一个容量上限。现在请求到达后端进行预订。
我需要做的是:
但是,后端api可能同时被调用。这可能导致SELECT语句返回最大值下的数字。容量两次,导致INSERT被执行多次(即使只剩下一个地方)。
对于上述案例,最好的预防措施是什么?设置事务隔离级别可序列化?还是可重复阅读?
我担心应用程序逻辑(即使它只是一个简单的if)可能会损害性能,因为读取和写入锁定不允许api执行只想在不插入任何内容的情况下选择数据的查询, ?
(使用mariaDB)
答案 0 :(得分:2)
您可以尝试在SELECT(mysql示例)中使用锁定提示“FOR UPDATE”:
BEGIN TRANSACTION;
SELECT * FROM TourCustomerXRef FOR UPDATE WHERE ...;
INSERT ...;
COMMIT;