我需要编写一个sql select语句而不在表中创建任何锁,但是读取已提交的记录。
有人可以帮忙吗...
答案 0 :(得分:1)
在默认事务隔离级别下读取/选择数据并不会锁定表,但它会在资源上获得一个名为“共享锁”的内容,这意味着多个用户可以读取所有获取资源上的共享锁的相同行。 / p>
当用户修改行时,它会在资源上获得Exclusive Lock。独占锁意味着在修改数据时没有其他人可以访问数据。它由该用户独占锁定。
因此,故事的道德是坚持默认事务隔离级别Read Committed
,并且它将在检索之前获取该行上的锁(共享锁),以避免Dirty读取。
否则不严格的隔离级别读取未提交不会获得任何锁定并将导致脏读。
答案 1 :(得分:0)
您可以打开READ_COMMITTED_SNAPSHOT数据库选项。启用该选项后,行版本控制而不是锁定用于提供默认的READ_COMMITTED隔离行为。
启用此选项会产生一些成本。每行还有14个字节,加上在tempdb中维护行版本存储的开销。但是,根据您的工作负载,并发改进可以抵消开销。您还需要确保应用程序未编码为依赖于默认锁定行为。