【发布时间】:2008-11-24 13:10:50
【问题描述】:
在使用单个活动连接的 SQL Server 中是否可能出现以下情况?
在 READCOMMITED 事务中,我需要更新一个表而不锁定它。例如,每次我执行一条语句时,我都会增加该表中的一个字段。如果事务失败,则不需要回滚此操作。此外,此更新不应阻止尝试更新相同位置的其他并发用户。
【问题讨论】:
标签: sql-server
在使用单个活动连接的 SQL Server 中是否可能出现以下情况?
在 READCOMMITED 事务中,我需要更新一个表而不锁定它。例如,每次我执行一条语句时,我都会增加该表中的一个字段。如果事务失败,则不需要回滚此操作。此外,此更新不应阻止尝试更新相同位置的其他并发用户。
【问题讨论】:
标签: sql-server
如果不对表加锁,就无法执行更新。这是为了让其他事务的事务隔离级别来控制它们是否可以“看到”更新中所做的更改。您可以更改更新的事务隔离级别,但这只会影响更新会话,(您设置它的位置)控制更新是否可以“看到”其他会话中所做的更改...
如果您希望其他 Sql 语句能够看到您在此更新中所做的事情,就好像它没有被锁定一样,您必须将其他 txs 上的事务隔离级别更改为未提交读取。 (注意这一点...这种隔离级别可能会导致您的数据库出现大量不一致。)
【讨论】:
您不能在写入期间不锁定表。
你的意思是你想写入一个表,但排他锁不一直持续到提交/回滚?
如果是这样,请将您需要的值放入表变量中(不受回滚/提交的影响)并将写入推迟到主事务之后。然后,执行一次更新以从表变量中推送值。
编辑:SQL 2008 workaround,稍后有其他想法
【讨论】: