【发布时间】:2019-12-12 11:13:19
【问题描述】:
所以,我的数据模型类似于分配问题。因此,假设我们有一家公司,可以为所要求的工作提供合适的工人。
目前,我有这样的关系:
-
Customer(身份证) -
Job(身份证) -
Worker(id,可用) -
Jobs In Progress(customer_id, job_id) -
Busy Workers(customer_id, worker_id)
Customer 和 Job 之间存在多对多,Customer 和 Worker 之间存在多对多。这些数据是实时的,因此是高度动态的。
我们想要维护这样的查询:
- 向工作人员申请工作。
- 工作完成后返回工人。
此查询需要读取、更新、删除和插入多个表中的数据。
例如,如果客户请求一个工人,我们要检查这个客户是否已经存在于表中;他是否已经在Busy Workers拥有合适的工人;如果没有,请在Worker 中找到合适的可用工人;检查此类工作是否已在Job 中注册。而在最坏的情况下,我们必须原子地在Customer中插入customer,在Job中插入job,在Jobs In Progress中插入相应的行,在Worker.avaiable中递减一行并在Busy Workers中插入一行。
在第二个查询中,我们必须以相反的顺序执行所有这些操作:递增 Worker.available,如果客户没有工作则删除,如果没有客户需要则删除工作,等等。
所以我们有很多一致性规则:忙碌工作人员的数量必须与Worker.available 一致,只有当客户请求未完成的工作时,他才必须出现在表中,工作必须出现在仅当没有客户请求此类工作时才使用该表。
我阅读了很多关于数据库中的隔离级别和锁定的信息,但我仍然不明白如何确保跨多个表的一致性。似乎隔离级别不起作用,因为涉及多个表,并且从两个表中选择的数据可能会变得不一致。而且锁似乎也不起作用,因为 AFAIK SQL Server 无法原子地获取多个表上的锁,因此锁之间的数据可能会变得不一致。
实际上,我正在寻找一个解决方案或解决方案的想法,而不参考具体的 RDBMS,它应该以一种或另一种方式适用于最著名的 RDBMS,如 MySQL、PostgreSQL、SQL服务器和甲骨文。因此,它不一定是包含所有这些 RDMS 示例的适当解决方案,也许是一些实践、提示或 参考文献。
我为我的英语道歉,提前谢谢你。
【问题讨论】:
-
你的问题实在是太笼统了。您希望将数据存储在一个地方,如果需要保持更新,请使用触发器,并在需要时计算值。设计一个完整的预订和分配系统是一项艰巨的任务。
-
@GordonLinoff 好吧,我认为我的问题可以简化为“如何确保 2 个相关表之间的一致性”。我相信,如果我可以用 2 张桌子做事,那么我可以把它传播到
n桌子上。但我什至不知道如果有 2 张桌子该怎么办。我在问题中描述的隔离和锁仍然存在问题。但我可能会出错,我对隔离和锁的理解可能是错误的,我很确定我是因为并发访问多个表并不是我想的那么罕见的任务。
标签: sql database concurrency transactions consistency