【发布时间】:2021-08-19 21:22:03
【问题描述】:
在使用 RDBMS 实现一个典型的会议室预订系统时,会有两个操作:
-- Check for any existing bookings that overlap with the period of noon-1pm
SELECT COUNT(*) FROM bookings WHERE room_id = 123 AND
end_time > '2015-01-01 12:00' AND start_time < '2015-01-01 13:00';
-- If the previous query returned zero:
INSERT INTO bookings
(room_id, start_time, end_time, user_id)
VALUES (123, '2015-01-01 12:00', '2015-01-01 13:00', 666);
代码来自:设计数据密集型应用程序(第 249 页)-- Martin Kleppmann
我们需要将隔离级别设置为可序列化,以避免两个用户认为没有冲突并插入两个冲突预订的情况。
我的问题是:
假设我们将每个预订时间段建模为一个文档,我们如何在 MongoDB 中实现一个可以避免冲突预订的系统?
-
我比较好奇MongoDB是如何处理并发事务的。
-
假设我想允许用户预订任何可能的时间段,而不仅仅是预定义的时间段。
-
假设用户A想预订时间段T1,B想预订时间段T2,T1和T2强>相互重叠。很有可能两个用户同时进入预约页面,通过 MongoDB 查询并没有发现冲突,他们都决定将两个相互冲突的时间段插入 DB。
-
在RDBMS中,我们设置了隔离级别来解决这个问题,那么MongoDB呢?
【问题讨论】:
-
And we'll need to set the isolation level to serializable是什么意思? -
@MuratColyaran 在 RDBMS 中,我们使用隔离级别来控制并发事务如何相互影响。在这种情况下,必须使用可序列化。
-
嘿@JohntheTraveler,你找到解决方案了吗?我正在尝试解决类似的问题。
标签: mongodb