当SqlConnection保持打开状态时,它会更新吗?

时间:2011-09-27 04:25:59

标签: .net sql-server sqlconnection

在我的ASP.NET项目中,我在必要时创建/打开一个SqlConnection,并在Application_EndRequest上关闭它

没关系,我只是想知道如果在打开连接(比如连接A)时,数据库会从另一个请求(比如连接B)更新,会发生什么。

所以就像这样

(最初说x是1)

A.Open()
B.Open()
B.UpdateX() - > SET x = 2
B.Close()
A.SelectX() - >这会返回1还是2? a。关闭()

2 个答案:

答案 0 :(得分:2)

SQL连接永远不会更新 - 它只不过是服务器的管道。当你把它移到其他地方时,就像你的汽车更新一样。

连接到的会话的事务服务器端(注意:你可以有多个连接到同一个事务 - 虽然我相信大多数人都不知道)(它是隐式的或显式的)显示数据根据它配置了隔离级别。有时候你需要音调,有时你需要音调。坐下来设计。

现在,保持连接打开的一个项目是它没有在页面之间正确重置,这可能会导致各种愚蠢的问题。几乎是反模式。我们最近在与Oracle的一个项目中遇到了一个问题,其中服务器在2小时之后断开了客户端而没有数据请求。-...并且在下一个sql发送之前,连接不会“关闭”(或显示已关闭)。导致您不想要的有趣错误 - 使用连接池来抵消性能开销。

答案 1 :(得分:2)

返回的数据取决于运行查询时DB的状态,而不是打开连接时的状态。

假设您没有在代码中使用任何特定的事务管理,并假设update语句是一个不同的行或表更新。在这种情况下,连接a将看到X = 2。这是因为两个连接都将使用为两个连接读取的默认事务级别。

现在,在您的示例中,如果单行上的单个值更新,则无法建立连接A读取X = 1。但是,如果您在连接B上使用事务并且不提交并保持连接打开。连接A的查询将阻塞,直到其超时到期。基本上,在B完成之前,X将无法访问。

此外,如果要在连接B的一个事务中更新1000万行,并且连接A在不同的线程和事务中。通过使用事务隔离级别“read uncommitted”,连接A有可能读取一些旧的/陈旧/无效的数据。

希望这会有所帮助。