gpt4 book ai didi

c# - RepeatableRead 似乎没有锁定读取

转载 作者:太空宇宙 更新时间:2023-11-03 11:38:51 25 4
gpt4 key购买 nike

我遇到了一个奇怪的问题。我有一个表,它有一个在 INSTEAD OF 触发器中生成的主键。这可能是实现主键的最糟糕的方法,但它们基本上是获取最大值,将其递增 1,然后使用该值作为键。这发生在 instead of 触发器中。

我有一个启动 RepeatableRead 事务的 .Net 应用程序,我将一条记录插入到该表中。只要我不尝试同时执行多个插入,这就可以正常工作。如果这样做,我会收到 PK 违规错误。在我看来,插入都被触发,触发器为每个事务获取相同的最后一个数字,将其递增 1,然后尝试插入具有相同新“标识符”的两条记录。

我已经与设置此触发器的 DBA 交谈过,他认为 RepeatableRead 应该阻止这种情况的发生,因为它显然会锁定表以进行读取,而其他事务将等待锁被释放。所以,本质上,我的交易将连续发生。

所以,问题是,如果 RepeatableRead 按照 DBA 描述的方式工作,为什么我会遇到 PK 违规?

最佳答案

RepeatableRead 不会解决这个问题,因为它允许幻像插入,这正是您在这里所拥有的。第二个插入是错误的,因为它没有“看到”前一个插入,并且您有描述的行为。

您可以使用可序列化隔离或通过执行单独的事务来修复它(前者会增加争用,后者会减少争用,但后者可能对您来说不可能)。

实际上,解决方法是用属性标识约束替换 instead of 触发器(这可以在现有表上完成,尽管存在困难,尤其是如果正在使用复制),或者使用更好的算法设置新值失败。

关于c# - RepeatableRead 似乎没有锁定读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5353431/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com