eao*_*son 5 database oracle concurrency constraints
我已经看过几次这样的问题,并且我正在尝试以非重叠的方式决定存储范围的最佳方式.例如,在安排某种资源时,一次只能有一个人使用.我看到的大多数是这样的:
PERSON ROOM START_TIME END_TIME
Col. Mustard Library 08:00 10:00
Prof. Plum Library 10:00 12:00
Run Code Online (Sandbox Code Playgroud)
防止新条目与现有时间表重叠的最佳方法是什么,例如,如果Scarlet小姐想要从11:00到11:30预订图书馆?内联约束不起作用,我不认为这可以在触发器中轻松完成.处理最初在表中查找现有冲突的所有插入的过程?
其次,处理并发问题的最佳方法是什么?说,Scarlet小姐在13:00到15:00之间想要图书馆,White夫人想要从14:00到16:00.(1)的程序会发现这些时间表都可以接受,但是明确地将它们放在一起,它们不是.我唯一能想到的是手动锁定表格或某种互斥锁.
上面的表((room,start_time)的主键是什么?
对于具有固定时间范围的情况的快速工作方式,您可以将所有范围存储在单独的表中,然后只需将其链接到“储备”表。它可以解决固定范围的问题,例如,您只能以 30 分钟的间隔预订图书馆,工作时间是从早上 8 点到晚上 8 点,只需要 24 条记录。
--Person table---------------
ID PERSON ROOM
1 Col. Mustart Library
2 Proof. Plum Library
--Timeshift table------------
ID START_TIME END_TIME
1 08:00 08:30
2 08:30 09:00
....
24 19:30 20:00
--Occupy table----
DATE TIMESHIFT PERSON
TRUNC(SYSDATE) TS_ID P_ID
08/12/2012 4 1
08/12/2012 5 1
08/12/2012 9 2
08/12/2012 10 2
Run Code Online (Sandbox Code Playgroud)
现在您将其设为 PK 或 UK,并且您的数据库驱动检查已准备就绪。它将很快,几乎没有数据开销。然而,每秒使用相同的例程不会那么有效。
更通用和复杂的方法是让一些程序(或触发器)检查,您的范围是否被占用,您将不得不检查所有当前记录。
| 归档时间: |
|
| 查看次数: |
441 次 |
| 最近记录: |