4

这是真的,“每个语句(选择/插入/删除/更新)具有隔离级别,无论交易”?数据库锁需要事务吗?

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

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

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

为了解决这个问题,我需要把 “选择” 中的TransactionScope报表?

+1

是;所有在显式事务内部或外部的语句都在某个隔离级别执行 - 但是哪个隔离级别取决于DBMS以及与会话关联的设置等。 – 2010-02-05 05:51:24

+0

在sql server的情况下它的行为如何。 – Buzz 2010-02-05 06:17:46

回答

2

在SQL Server上,每个事务都有一个隐式或显式事务级别。如果使用BEGIN/COMMIT/ROLLBACK TRANSACTION进行调用,则显式为明确的,如果没有发布这样的内容,则隐含。

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

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