Sql server 在分布式系统中链接SQL Server表中的行
假设我有以下SQL表,其中每个值都引用了前一个值: 链式Sql server 在分布式系统中链接SQL Server表中的行,sql-server,concurrency,race-condition,Sql Server,Concurrency,Race Condition,假设我有以下SQL表,其中每个值都引用了前一个值: 链式 +------------------+--------------------------------------+------------+--------------------------------------+ | SequentialNumber | GUID | CustomData | LastGUID
+------------------+--------------------------------------+------------+--------------------------------------+
| SequentialNumber | GUID | CustomData | LastGUID |
+------------------+--------------------------------------+------------+--------------------------------------+
| 1 | 792c9583-12a1-4c95-93a4-3206855d284f | OtherData1 | 0 |
+------------------+--------------------------------------+------------+--------------------------------------+
| 2 | 1022ffd3-afda-4e20-9d45-eec884bc2a50 | OtherData2 | 792c9583-12a1-4c95-93a4-3206855d284f |
+------------------+--------------------------------------+------------+--------------------------------------+
| 3 | 83729ad4-2564-4146-b451-00d82585bd96 | OtherData3 | 1022ffd3-afda-4e20-9d45-eec884bc2a50 |
+------------------+--------------------------------------+------------+--------------------------------------+
| 4 | d7197e87-d7d6-4175-8172-12656043a69d | OtherData4 | 83729ad4-2564-4146-b451-00d82585bd96 |
+------------------+--------------------------------------+------------+--------------------------------------+
| 5 | c1d3d751-ef34-4079-a73c-8952f93d17db | OtherData5 | d7197e87-d7d6-4175-8172-12656043a69d |
+------------------+--------------------------------------+------------+--------------------------------------+
如果插入第六行,我将使用如下查询检索最后一行的数据:
SELECT TOP 1 (SequentialNumber, GUID) FROM ChainedTable ORDER BY SequentialNumber DESC;
在该选择之后和插入下一行之前,将在数据库之外执行一个操作
如果确保每次只有一个实体使用该表,这就足够了。但是,如果更多实体可以执行相同的操作,则存在竞争条件的风险。有可能一个实体在对第二行进行插入之前请求最后一行的信息
首先,我考虑用一个值创建一个新表,该值指示该表是否正在使用(该值可以为null,也可以是访问该表的进程的标识符)。在该解决方案中,如果该值指示另一个进程正在使用该表,则实体不会启动最后一个操作的请求。然而,在这种情况下可能发生的事情之一是,使用表的进程可能会在不释放表的情况下死亡,从而阻塞整个系统
我确信这是一个“典型的”计算机科学问题,并且有众所周知的解决方案来实现这一点。有人能给我指出正确的方向吗?我认为在SQL中使用事务可以解决这个问题。例如,如果您创建一个将添加新行的事务,在第一个事务完成之前,其他人将无法执行相同的事务。只需搜索该术语。当一个进程(及其与数据库的连接)死亡时,任何锁都将自动释放。这是一种你应该预测、处理和测试的情况,但这种情况应该很少发生。我不明白:你为什么要选择序列号?只需让服务器增加下一个ID(它完全能够安全地执行)。或者您正在尝试执行其他操作?要回显@Charlieface,为什么不使用默认值为dbo.SomeSequence的标识列或列?