Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在分布式系统中链接SQL Server表中的行_Sql Server_Concurrency_Race Condition - Fatal编程技术网

Sql server 在分布式系统中链接SQL Server表中的行

Sql server 在分布式系统中链接SQL Server表中的行,sql-server,concurrency,race-condition,Sql Server,Concurrency,Race Condition,假设我有以下SQL表,其中每个值都引用了前一个值: 链式 +------------------+--------------------------------------+------------+--------------------------------------+ | SequentialNumber | GUID | CustomData | LastGUID

假设我有以下SQL表,其中每个值都引用了前一个值:

链式

+------------------+--------------------------------------+------------+--------------------------------------+
| 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的标识列或列?