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

时间:2015-11-19 17:51:14

标签: sql sql-server vb.net vb6

假设我在SQL Studio管理器中运行以下代码:

begin transaction
update Person set Name='Ian' where id=1

然后关闭SQL studio管理器,我看到以下警告:

  

有未提交的交易。您希望在关闭窗口之前提交这些事务吗?

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

这如何与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工作室管理器并执行以下语句:

select * from person where id=1

SQL Studio挂起,即它不返回结果。然后我再次执行步骤1-3,这次正确回滚事务。程序成功完成,即VB6客户端未锁定该行。然后我可以在SQL Studio管理器中运行SELECT语句(它返回一个结果):

select * from person where id=1

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

2 个答案:

答案 0 :(得分:2)

在(重新)启动sql-server-service时回滚任何未通信的事务。 早期的回滚取决于连接池等多种因素,并在What happens to an uncommitted transaction when the connection is closed?

中进行了解释

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

SQL工作室管理器的挂起最可能是从隔离级别设置为类似serializable和新查询等待“干净”数据(不应该在脏读或类似情况下发生)。因此,这意味着事务未提交或回滚(或者您的服务器可能无法满负荷运行)。因此,这可能是因为连接池或TCP连接尚未关闭/ TCP-timeout尚未发生。

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

答案 1 :(得分:1)

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