【问题标题】:Do DB locks require transactions?数据库锁需要事务吗?
【发布时间】:2011-01-13 09:31:26
【问题描述】:

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

我有一个场景,我在事务中设置了语句更新(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”语句吗?

【问题讨论】:

  • 是的;所有语句,无论是在显式事务内部还是外部,都在某个隔离级别执行 - 但哪个隔离级别取决于 DBMS 和与会话相关的设置等。
  • 在 sql server 的情况下它的行为。

标签: sql-server transactions isolation-level read-committed-snapshot


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2017-12-30
    • 2014-12-07
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2015-06-24
    • 2014-08-21
    • 1970-01-01
    相关资源
    最近更新 更多