【发布时间】:2010-09-21 11:27:48
【问题描述】:
我正在创建一个多租户应用程序,其中一些表需要按顺序分配整数值。订购是针对每个租户独立完成的。作为一个具体的例子,考虑一个带有RegNumber 列的Student 表。 RegNumber 必须按顺序分配,但顺序是每个租户本地的。
我正在考虑的解决方案涉及使用另一个表来保存每个租户的“下一个可用”RegNumber 值,这让我提出了几个问题:
- 有没有更好的办法?
- 在单个事务中执行“SELECT FROM tenant_studentid_sequence”和“INSERT INTO students”的最佳方法是什么,而不需要过度锁定,并且不可能跳过或重复值?
在 MySQL 中,我可以使用 SELECT FOR UPDATE,但是 SQL Server 2008 呢?有不少讨论on this SO question,不过好像是基于SQL Server 2005。2008有什么变化吗?推荐的策略是什么?
编辑 1: 我想我应该澄清我所说的“独立地为每个租户”是什么意思。我正在寻找的是一种让每个租户拥有一组按顺序排列的学生 ID 的方法。也就是说,租户 A 将有 ID 为 1、2、3、... 的学生,租户 B 也将如此。将它们视为业务密钥。我有对客户隐藏的全局身份 GUID。
【问题讨论】:
-
您是否有理由不能为此使用标识列?
-
我已经编辑了这个问题,让事情变得更清楚一些。身份列不允许我为每个租户拥有独立的序列。我需要租户 A 和 B 拥有 ID 为 1、2、3、...的学生实例。
-
这是一种需要推后的要求。为此创建一个好的解决方案是昂贵的,并且很难正确维护并且完全没用。为什么他们需要为每个客户提供相同的号码? 99.9% 的时间完全没有意义。这样做是浪费客户的钱。
-
@HLGEM:不是同一个客户端;该应用程序是多租户的。每个租户都需要有一个干净的学生 ID 序列。
-
我们有多租户数据库并使用身份,数字应该没有意义,如果一个客户的 id 为 1100 而另一个客户的 id 为 1101 无关紧要。确实这是一个糟糕的要求,需要大量工作没有任何收获。
标签: sql-server transactions locking