gpt4 book ai didi

c# - SQL Server 中的自动提交事务使用什么隔离级别?

转载 作者:太空宇宙 更新时间:2023-11-03 12:57:58 26 4
gpt4 key购买 nike

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

条件:ALLOW_SNAPSHOT_ISOLATION 开启,READ_COMMITTED_SNAPSHOT 关闭

第 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 步

隔离级别是快照。我希望第 3 步显示 READCOMMITTED,因为 READ_COMMITTED_SNAPSHOT 已关闭。

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

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

任何想法将不胜感激。

谢谢,

最佳答案

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

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

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

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

关于c# - SQL Server 中的自动提交事务使用什么隔离级别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33253260/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com