【问题标题】:Update without locking inside a transaction更新而不锁定在事务中
【发布时间】:2008-11-24 13:10:50
【问题描述】:

在使用单个活动连接的 SQL Server 中是否可能出现以下情况?

在 READCOMMITED 事务中,我需要更新一个表而不锁定它。例如,每次我执行一条语句时,我都会增加该表中的一个字段。如果事务失败,则不需要回滚此操作。此外,此更新不应阻止尝试更新相同位置的其他并发用户。

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    如果不对表加锁,就无法执行更新。这是为了让其他事务的事务隔离级别来控制它们是否可以“看到”更新中所做的更改。您可以更改更新的事务隔离级别,但这只会影响更新会话,(您设置它的位置)控制更新是否可以“看到”其他会话中所做的更改...

    如果您希望其他 Sql 语句能够看到您在此更新中所做的事情,就好像它没有被锁定一样,您必须将其他 txs 上的事务隔离级别更改为未提交读取。 (注意这一点...这种隔离级别可能会导致您的数据库出现大量不一致。)

    【讨论】:

      【解决方案2】:

      您不能在写入期间不锁定表。

      你的意思是你想写入一个表,但排他锁一直持续到提交/回滚?

      如果是这样,请将您需要的值放入表变量中(不受回滚/提交的影响)并将写入推迟到主事务之后。然后,执行一次更新以从表变量中推送值。

      编辑:SQL 2008 workaround,稍后有其他想法

      【讨论】:

      • tx,自主交易真的很有意思。
      • 关于将它放在表变量上的解决方案,假设我有一个长 SP,它插入到表中并获取该插入的 IDENTITY 值,现在我根据这个值做其他事情.. .. 使用您的解决方案我该怎么做?我不认为我能做到。 (我也有一个很长的 sp,它基于 Identities 做了很多 CPU 和许多插入,但我不想阻塞整个系统)......你的解决方案可以解决它吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-22
      • 1970-01-01
      • 1970-01-01
      • 2023-02-15
      • 1970-01-01
      相关资源
      最近更新 更多