4

“无论事务如何,每个语句(选择/插入/删除/更新)都有一个隔离级别”是真的吗?

我有一个场景,我在事务(ReadCommitted)中设置了语句的更新。另一个不在事务中的集合(选择语句)。

  1. 在这种情况下,当第一组正在执行另一个等待时。
  2. 如果我为 DB 死锁设置 READ_COMMITTED_SNAPSHOT。

    ALTER DATABASE Amelio SET ALLOW_SNAPSHOT_ISOLATION ON
    ALTER DATABASE Amelio SET READ_COMMITTED_SNAPSHOT ON
    

要解决这个问题,我是否需要在 TransactionScope 中放入“Select”语句?

4

1 回答 1

2

在 SQL Server 上,每个事务都有一个隐式或显式事务级别。如果用 调用,则为显式BEGIN/COMMIT/ROLLBACK TRANSACTION,如果未发出此类,则为隐式。

在更新查询开始之前启动您的快照。否则,SQL Server 没有机会将更改的行准备到 tempdb 中,并且更新查询仍然打开锁。

另一种不创建快照隔离SELECT <columns> FROM <table> WITH (NOLOCK)的方法是使用 which 告诉 SQL Server 无论如何都要获取行(又名 READ_UNCOMMITED)。由于它是一个查询提示,即使您的设置也会改变隔离级别。如果您不关心查询行的哪个状态,则可以工作 - 但是在评估收到的数据时需要谨慎。

于 2010-02-05T10:55:41.127 回答