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



假设我有以下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中使用Transaction可以解决这个问题。例如,如果您创建了一个将添加新行的事务,那么在第一个事务完成之前,其他人将无法执行相同的事务。

相关内容

最新更新