【问题标题】: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 之前没有“关闭”(或显示关闭)。导致您不想要的有趣错误 - 使用连接池来抵消性能开销。

      【讨论】:

        猜你喜欢
        • 2011-05-25
        • 2019-04-16
        • 1970-01-01
        • 2010-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-25
        相关资源
        最近更新 更多