当然,您也可以使用 LINQ 安全地完成这项工作:
- 将对底层 SystemValues 表的访问包装在 TRANSACTION 中的“GetIDValue.....()”函数中(而不是使用 READUNCOMMITTED 隔离级别!),然后只有一个用户可以在任何给定时间访问该表,并且您应该能够安全地分发 ID
- 如果您正在处理新实体(如果尚未设置 ID),则在保存实体之前从 LINQ 调用该存储过程并存储 ID
- 将您的实体存储在数据库中
这应该可以工作——不确定它是否比让数据库处理工作更快、更有效——但它应该可以工作——而且安全。
马克
更新:
像这样的东西(适应您的需要)将安全地工作:
CREATE PROCEDURE dbo.GetNextTableID(@TableID INT OUTPUT)
AS BEGIN
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
BEGIN TRANSACTION
UPDATE SystemTables
SET MaxTableID = MaxTableID + 1
WHERE ........
SELECT
@TableID = MaxTableID
FROM
dbo.SystemTables
COMMIT TRANSACTION
END
至于性能 - 只要您有合理数量的并发用户(可能少于 50 个),并且只要此SystemTables
表不用于其他用途,那么它应该可以执行。