SQL 服务器中的自动提交事务使用什么隔离级别?
What isolation level does autocommit transaction use in SQL Server?
当我使用 SNAPSHOT 隔离级别处理更新冲突问题时,自动提交事务似乎使用上次使用的隔离级别。
条件:ALLOW_SNAPSHOT_ISOLATION开启,READ_COMMITTED_SNAPSHOT关闭
第一步:执行无事务更新语句
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 已关闭。
我有两个想法,但我无法得出结论。
- dm_exec_sessions 将不包含有关自动提交事务的信息
- 自动提交事务实际使用
SNAPSHOT
任何想法将不胜感激。
谢谢,
自动提交事务没有特定的隔离级别。他们使用上次为连接声明的任何隔离级别(或服务器默认值)。
然而不幸的是,面对连接池1,你认为的"new"连接实际上可能是一个重复使用的连接。因此,在某些情况下,您会选择使用不同于 SQL 服务器默认设置(已提交读取)的隔离级别的连接。
我的建议是 - 如果您在任何地方使用明确的隔离级别,您还需要确保使用 不同的 连接字符串,或者您需要将 off 连接池,如果你不想显式设置隔离级别 everywhere。我通常更喜欢第一个,这样您仍然可以从连接池中受益,但每个所需的隔离级别都有单独的池。
1 Connect Issue 这似乎表明这可能适用于 SQL Server 2014 及更高版本。
当我使用 SNAPSHOT 隔离级别处理更新冲突问题时,自动提交事务似乎使用上次使用的隔离级别。
条件:ALLOW_SNAPSHOT_ISOLATION开启,READ_COMMITTED_SNAPSHOT关闭
第一步:执行无事务更新语句
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 已关闭。
我有两个想法,但我无法得出结论。
- dm_exec_sessions 将不包含有关自动提交事务的信息
- 自动提交事务实际使用
SNAPSHOT
任何想法将不胜感激。
谢谢,
自动提交事务没有特定的隔离级别。他们使用上次为连接声明的任何隔离级别(或服务器默认值)。
然而不幸的是,面对连接池1,你认为的"new"连接实际上可能是一个重复使用的连接。因此,在某些情况下,您会选择使用不同于 SQL 服务器默认设置(已提交读取)的隔离级别的连接。
我的建议是 - 如果您在任何地方使用明确的隔离级别,您还需要确保使用 不同的 连接字符串,或者您需要将 off 连接池,如果你不想显式设置隔离级别 everywhere。我通常更喜欢第一个,这样您仍然可以从连接池中受益,但每个所需的隔离级别都有单独的池。
1 Connect Issue 这似乎表明这可能适用于 SQL Server 2014 及更高版本。