自动提交事务在SQL Server中使用什么隔离级别?

本文关键字:什么 隔离级 提交事务 SQL Server | 更新日期: 2023-09-27 18:18:34

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

条件:ALLOW_SNAPSHOT_ISOLATION is ON, READ_COMMITTED_SNAPSHOT is OFF

步骤1:执行没有事务的update语句

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隔离级别的事务的update语句

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是OFF。

我猜想有两种想法,但我不能得出结论。

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

如有任何意见,不胜感激。

谢谢,

自动提交事务在SQL Server中使用什么隔离级别?

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

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

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

1连接问题,这似乎表明,这可能是或可能不是SQL Server 2014及以后的真实