【问题标题】:What isolation level does autocommit transaction use in SQL Server?SQL Server 中自动提交事务使用什么隔离级别?
【发布时间】:2015-10-21 07:23:41
【问题描述】:

当我使用 SNAPSHOT 隔离级别处理更新冲突问题时,自动提交事务似乎使用上次使用的隔离级别。

条件:ALLOW_SNAPSHOT_ISOLATION 为 ON,READ_COMMITTED_SNAPSHOT 为 OFF

第 1 步:在没有事务的情况下执行更新语句

using (var sqlconn = new SqlConnection("Data source=..."))
using (var sqlcmd = sqlconn.CreateCommand())
{
    sqlconn.Open();
    sqlcmd.CommandText = "Update ..."
    sqlcmd.ExecuteNonQuery();
}

然后查看sys.md_exec_sessions,发现事务隔离级别为READCOMMITTED

第 2 步:使用 SNAPSHOT 隔离级别的事务执行更新语句

using (var sqlconn = new SqlConnection("Data source=..."))
{
    sqlconn.Open();

    using (var sqltran = sqlconn.BeginTransaction(IsolationLevel.Snapshot))
    using (var sqlcmd = sqlconn.CreateCommand())
    {
        sqlconn.Open();
        sqlcmd.CommandText = "Update ..."
        sqlcmd.ExecuteNonQuery();
    }
}

隔离级别为Snapshot,效果不错。

第 3 步:再次执行第 1 步

隔离级别为Snapshot。 我希望第 3 步显示 READCOMMITTED 导致 READ_COMMITTED_SNAPSHOT 处于关闭状态。

我有两个想法,但我无法得出结论。

  1. dm_exec_sessions 将不包含有关自动提交事务的信息
  2. 自动提交事务实际使用SNAPSHOT

任何想法都会受到赞赏。

谢谢,

【问题讨论】:

    标签: c# sql-server transactions ado.net


    【解决方案1】:

    自动提交事务没有特定的隔离级别。他们使用上次为连接声明的任何隔离级别(或服务器默认值)。

    然而,不幸的是,面对连接池1,您认为的“新”连接实际上可能是一个重复使用的连接。因此,在某些情况下,您会选择使用不同于 SQL Server 默认(已提交读)的隔离级别的连接。

    我的建议是 - 如果您在任何地方使用显式隔离级别,您还需要确保使用 不同 连接字符串,或者您需要关闭 连接池,如果您不想显式设置隔离级别everywhere。我通常更喜欢第一个,这样您仍然可以从连接池中受益,但每个所需的隔离级别都有单独的池。

    1Connect Issue 这似乎表明这对于 SQL Server 2014 及更高版本可能是正确的,也可能不是。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-27
      • 2018-02-02
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多