【问题标题】:When a SqlConnection is kept open, does it update?当 SqlConnection 保持打开状态时,它会更新吗?
【发布时间】:2011-09-27 04:25:59
【问题描述】:
在我的 ASP.NET 项目中,我在必要时创建/打开一个 SqlConnection,并在 Application_EndRequest 处关闭它
没关系,我只是想知道如果在打开连接(例如连接 A)时,数据库从另一个请求(例如连接 B)更新会发生什么。
原来是这样的
(假设最初 x 为 1)
A.Open()
B.Open()
B.UpdateX() --> SET x=2
B.关闭()
A.SelectX() --> 这会返回 1 还是 2?
A.关闭()
【问题讨论】:
标签:
.net
sql-server
sqlconnection
【解决方案1】:
返回的数据取决于您运行查询时的数据库状态,而不是您打开连接时的状态。
假设您没有在代码中使用任何特定的事务管理,并假设更新语句是一个不同的行或表更新。在这种情况下,连接 a 将看到 X=2。这是因为两个连接都将使用默认事务级别,这两个连接都已提交读取。
现在,在您的示例中,如果连接 A 是单行上的单个值更新,则无法使连接 A 读取 X=1。但是,如果您在连接 B 上使用事务并且不提交并使连接保持打开状态。连接 A 的查询将阻塞,直到其超时到期。基本上,在 B 完成之前,X 将无法访问。
此外,如果您在连接 B 的一个事务中更新 1000 万行,而连接 A 位于不同的线程和事务中。通过使用“未提交读取”的事务隔离级别,连接 A 有可能读取一些旧的/陈旧的/无效的数据。
希望这会有所帮助。
【解决方案2】:
SQL 连接永远不会更新 - 它只不过是连接服务器的管道。这就是说,当您将汽车移到其他地方时,它就会更新。
连接所连接的会话的事务服务器端(注意:您可以有多个连接到同一个事务 - 尽管我相信大多数人不知道)(这是隐式的或显式的)显示数据根据它是配置的隔离级别。有时你想要语气的东西,有时是其他的。坐下来设计。
现在,保持连接打开的一个问题是它没有在页面之间正确重置,这可能会导致各种愚蠢的问题。几乎是反模式。我们最近在 Oracle 的一个项目中遇到了一个问题,服务器在没有数据请求的情况下 2 小时后断开了客户端的连接。-...并且连接在发送下一个 sql 之前没有“关闭”(或显示关闭)。导致您不想要的有趣错误 - 使用连接池来抵消性能开销。