【发布时间】:2010-09-07 09:59:52
【问题描述】:
如何避免数据库中的读锁?
欢迎回答多个数据库!
【问题讨论】:
标签: sql database performance locking
如何避免数据库中的读锁?
欢迎回答多个数据库!
【问题讨论】:
标签: sql database performance locking
在 SQL Server 中,您可以在选择语句中使用 with(nolock) 关键字。例如:
Select table1.columna, table2.columna
from table1 with(nolock), table2 with(nolock)
确保为查询中的每个表/视图指定 with(nolock)。
【讨论】:
uncommitted 数据可能会导致灾难性后果:stackoverflow.com/questions/686724/… 通常这不是问题,尤其是使用“新”快照功能时,但您必须注意后果: codinghorror.com/blog/2008/08/deadlocked.html
在Oracle 中,默认操作模式是已提交的 隔离级别,其中select 语句不会被另一个修改它正在读取的数据的事务阻塞。 来自Data Concurrency and Consistency:
事务执行的每个查询只能看到在查询(而不是事务)开始之前提交的数据。 Oracle 查询从不读取脏(未提交)数据。
【讨论】:
Jeff Atwood 有一篇关于这个主题的好帖子:
【讨论】:
在 Firebird 中,作者从不阻塞读者,也没有脏读。只有读提交和快照隔离级别。
它使用多代引擎(我相信像 oracle)而不是简单的页面或记录锁定。
【讨论】:
PostgreSQL 还使用 MVCC(多版本并发控制),因此使用默认事务隔离级别(已提交读),您永远不应该阻塞,除非有人在数据库上进行维护(删除/添加列/表/索引/ 等)。
【讨论】: