回答

收藏

处理SQL Server并发问题

技术问答 技术问答 227 人阅读 | 0 人回复 | 2023-09-12

有时候我需要得到唯一的ID并将其与记录一起存储,但我不能使用标识列。因此,我有一个使用标签字段和整数唯一的ID表。当需要唯一的时候ID当我调用存储过程并传递标签时,它会吐出与之相关的下一个ID。当然,这在一个并发的环境中是非常重要的。换句话说,对于给定的标签,存储过程永远不应返回相同的值两次。由于对事务隔离的了解有限,我需要执行以下操作:
1 g! ]2 t& ~3 ^, x6 ~3 F& D1)将事务隔离级别设置为可序列7 S' d; g' ~2 q+ m: X4 \$ S
2)从UniqueIdTable WHERE标签SELECT ID = @inputLabel7 {! j4 o5 ~$ T( q- s! N
3)更新UniqueIdTable SET ID = ID   1 WHERE标签= @inputLabel  O, C, U( M" j0 G
4)返回2)检索到的ID
* f- g$ B  B  W1 a' K但这真的安全吗?即使使用可序列化隔离,两个线程是否仍然可以并发执行,直到步骤2)?我的理解是,最高的隔离级别只确保单个事务将执行,而不是幻觉或更改其他线程中的数据。如果是这样,请同时调用两次GetID函数可能会返回相同的值。1 l- F6 s( X7 p, x" J: V; E8 o( g
我是否对隔离级别有误解?我如何保证不会发生这种情况?
; J5 z& p( l& H) }9 q: U; J我还有另一个问题需要解决。假设我有一个包含一个字段和第二个表的外键的表。起初,第一张表中的记录在第二张表中没有相应的记录,所以我会NULL存储在这个字段中。现在,在某个时候,用户操作了一个操作,它将在第二个表中生成一个记录,并将第一个表链接到记录中。这一直是一对一的关系,因此,如果两个用户同时尝试生成记录,他们将创建并链接到单个记录,另一个用户将收到一条信息,表明记录已经存在。如何确保重复项不会在并发环境中创建?
( G) Z  |6 d4 \0 P                                                               
3 b/ N; ?( n+ k+ h' ]" _    解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则