假设我在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
连接池是否保持事务处于打开状态?
答案 0 :(得分:2)
在(重新)启动sql-server-service时回滚任何未通信的事务。 早期的回滚取决于连接池等多种因素,并在What happens to an uncommitted transaction when the connection is closed?
中进行了解释连接池是否保持事务处于打开状态?
SQL工作室管理器的挂起最可能是从隔离级别设置为类似serializable和新查询等待“干净”数据(不应该在脏读或类似情况下发生)。因此,这意味着事务未提交或回滚(或者您的服务器可能无法满负荷运行)。因此,这可能是因为连接池或TCP连接尚未关闭/ TCP-timeout尚未发生。
您可能还需要查看连接参数命令超时和连接超时,以改善应用程序的行为。
答案 1 :(得分:1)
快速回答。事务处于未提交状态,直到您提交,回滚或连接已关闭。如果连接已关闭,则会回滚。