Sql 未提交也未回滚的活动事务的默认行为

Sql 未提交也未回滚的活动事务的默认行为,sql,sql-server,vb.net,vb6,Sql,Sql Server,Vb.net,Vb6,假设我在SQL Studio Manager中运行以下代码: begin transaction update Person set Name='Ian' where id=1 然后关闭SQL studio manager,我看到以下警告: 存在未提交的事务。是否要在关闭窗口之前提交这些事务 如果选择“是”,则提交事务。如果选择“否”,则会回滚 这是如何与VB6/.NET程序一起工作的?假设我有导致错误/异常的代码,并且事务既没有提交也没有回滚(应该是这样的)。事务是否无限期地保持活动状态,或

假设我在SQL Studio Manager中运行以下代码:

begin transaction
update Person set Name='Ian' where id=1
然后关闭SQL studio manager,我看到以下警告:

存在未提交的事务。是否要在关闭窗口之前提交这些事务

如果选择“是”,则提交事务。如果选择“否”,则会回滚

这是如何与VB6/.NET程序一起工作的?假设我有导致错误/异常的代码,并且事务既没有提交也没有回滚(应该是这样的)。事务是否无限期地保持活动状态,或者是否有时间限制?事务是否已提交或回滚

更新 我编写了一个VB6程序,它:

1) Establishes a connection to a database
2) Executes the following SQL statement inside a serialized  transaction: UPDATE Person SET Name='Ian' WHERE ID=1 (Name  changed from Ian)
3) Throw an error and close application without committing nor rolling back the transaction
然后打开SQL studio manager并执行以下语句:

select * from person where id=1
SQL Studio挂起,即不返回结果。然后我再次运行步骤1-3,这次正确地回滚事务。程序成功完成,即VB6客户端的行未锁定。然后,我可以在SQL Studio Manager中运行SELECT语句(它返回一个结果):


连接池是否使事务保持打开状态?

快速回答。事务处于未提交状态,直到您提交、回滚或连接关闭。如果连接已关闭,则会回滚。

快速回答。事务处于未提交状态,直到您提交、回滚或连接关闭。如果连接已关闭,则会回滚。

当(重新)启动sql server服务时,会回滚任何未限制的事务。 早期回滚取决于多个因素,如连接池,有关详细信息,请参阅

连接池是否使事务保持打开状态?

sqlstudio管理器的挂起很可能是从隔离级别设置为类似serializable和等待“clean”数据的新查询(脏读或类似的情况不应该发生)。因此,这意味着事务既没有提交也没有回滚(或者您的服务器不太可能满负荷工作)。因此,这可能是因为连接池或TCP连接尚未关闭/TCP超时尚未发生


您可能还希望查看连接参数命令超时和连接超时,以改进应用程序的行为。

当(重新)启动sql server服务时,任何未限制的事务都会回滚。 早期回滚取决于多个因素,如连接池,有关详细信息,请参阅

连接池是否使事务保持打开状态?

sqlstudio管理器的挂起很可能是从隔离级别设置为类似serializable和等待“clean”数据的新查询(脏读或类似的情况不应该发生)。因此,这意味着事务既没有提交也没有回滚(或者您的服务器不太可能满负荷工作)。因此,这可能是因为连接池或TCP连接尚未关闭/TCP超时尚未发生


您可能还需要查看连接参数命令timeout和连接timeout,以改进应用程序的行为。

我已经为这个问题添加了一个更新。你能看一下吗+1用于链接。@w0051977根据问题更新添加了信息我已向问题添加了更新。你能看一下吗+1用于链接。@w0051977根据问题更新添加了信息我已向问题添加了更新。你能看一下吗?我给这个问题添加了一个更新。你能看一看吗?为什么你让自己进入这样一种状态,然后想知道这种行为是什么?当然,正确的做法是改变你的代码,这样你就不会一开始就处于这种状态?@Damien_,不信者,是的,我同意。我只是好奇发生了什么。为什么你让自己进入这样一种状态,然后想知道这种行为是什么?当然,正确的做法是改变你的代码,这样你就不会一开始就处于这种状态?@Damien_,不信者,是的,我同意。我只是好奇发生了什么事。
select * from person where id=1