2016-01-23 61 views
1

PostgreSQL 9.3如何防止覆盖共享约会簿中的记录?

我正在写一个标准的预约书。该书每隔15分钟会有三列,并且会有多个客户端同时从不同的位置写入。

如果两个用户的A和B同时预约,我该如何阻止用户B覆盖用户A的约会? (也就是说,一旦用户A预约了 ,用户B的信息就会过时 - 直到他试图保存预约记录时,他才会知道用户A做了什么)。如果用户B想要使用的约会时间已经被分配,我希望用户B被通知它不可用并且不覆盖用户A.

我确定这是一个基本和常见的问题,但我无法把头围住它。

感谢您的任何帮助,建议或参考。

+1

https://en.wikipedia.org/wiki/Optimistic_concurrency_control –

+0

此外,你最好只存储实际约会,而不是每隔15分钟间隔 –

+1

@NeilMcGuigan +1来定义真正的问题。 :) –

回答

1

如果存储的约会,例如

ID,CUSTOMER_ID,时间
1,32,2016年3月10日十时15分00秒
...

只需添加一个独特的时间列上的索引。然后,如果您尝试在同一时间插入一行,则会出现错误。如果您想同时允许多个预订,则可以添加time_slot列并将其包含在索引中。

ID,CUSTOMER_ID,时间,TIME_SLOT
1,32,2016年3月10日10点15分00秒,1
2,15,2016年3月10日10点15分00秒,2

create unique index appointments_time_timeslot_idx on appointments (time, time_slot); 
+0

@BjornNisson经过深思熟虑后,我得出了同样的结论。在我的情况下,额外的问题是实际的保存是通过默认为乐观并发的实体框架执行的。两者之间的管理有点棘手。 :) –

+0

你确定你甚至需要锁定?如果你想预约预约时间,你可以通过“确认”栏来解决。然后,您可以在用户选择时间后立即插入一行,并在用户确认时将确认标志更新为true。 –

+0

然后您可以例如清理工作,删除旧的未确认预订。 –