自动提交事务在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。
我猜想有两种想法,但我不能得出结论。
- dm_exec_sessions将不包含自动提交事务的信息 autocommit事务实际使用
SNAPSHOT
如有任何意见,不胜感激。
谢谢,
自动提交事务没有特定的隔离级别。它们使用上次为连接声明的隔离级别(或服务器默认值)。
然而,不幸的是,面对连接池1,您认为的"新"连接实际上可能是一个被重用的连接。因此,在某些情况下,您将选择使用与SQL Server默认隔离级别(读取提交)不同的连接。我的建议是——如果你在任何地方使用显式隔离级别,你还需要确保你使用不同的连接字符串,或者你需要关闭连接池,如果你不想在所有地方显式设置隔离级别。我通常更喜欢第一种,这样您仍然可以从连接池中获益,但是为每个所需的隔离级别使用单独的池。
1连接问题,这似乎表明,这可能是或可能不是SQL Server 2014及以后的真实