数据库锁需要事务吗?

4

“每个语句(select/insert/delete/update)都有一个隔离级别,无论是否在事务中”这是真的吗?

我有一个场景,在其中我设置了在事务中更新语句(ReadCommitted)。还有另一组不在事务中的语句(select语句)。

  1. In this case when first set is executing another waits.
  2. If I set READ_COMMITTED_SNAPSHOT for DB Deadlock occurs.

    ALTER DATABASE Amelio SET ALLOW_SNAPSHOT_ISOLATION ON
    ALTER DATABASE Amelio SET READ_COMMITTED_SNAPSHOT ON
    
为了解决这个问题,我需要在TransactionScope中放置“Select”语句吗?

1
是的,所有语句在明确事务内外都以某种隔离级别执行,但具体使用哪种隔离级别取决于数据库管理系统和会话相关的设置等因素。 - Jonathan Leffler
在 SQL Server 的情况下它的行为如何。 - Buzz
1个回答

2
在SQL Server中,每个事务都有一个隐式或显式的事务级别。如果使用了BEGIN/COMMIT/ROLLBACK TRANSACTION,则为显式;否则为隐式。
在更新查询开始之前启动快照。否则,您将无法给SQL Server准备更改后的行到tempdb,更新查询仍然保持锁定状态。
另一种不创建快照隔离的方法是使用SELECT <columns> FROM <table> WITH (NOLOCK),这是告诉SQL Server无论如何都获取行的方式(也称为READ_UNCOMMITED)。由于它是一个查询提示,因此即使您的设置也会更改隔离级别。如果您不介意查询行的状态,则可以使用此方法 - 但在评估接收到的数据时需要谨慎。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接