繁体   English   中英

如果客户端进程在事务启动后被终止,则数据库表保持锁定状态

[英]Database table remains locked, if client process is killed after transaction start

我有一个C#应用程序,它使用事务处理SQL Server数据库中的表中的数据。 代码非常简单,基本上是这样的:

 public string ConnectionString;
 public OleDbConnection DbConnection;
 public OleDbTransaction DbTransaction;

 // ... some initialization stuff ...

 DbTransaction = DbConnection.BeginTransaction();
 try 
 {
     // ... some insert/update/delete here ...
     DbTransaction.Commit();
 } 
 catch (Exception e)
 {
      // ...
      DbTransaction.Rollback();
 }

现在,客户报告了一种情况,即表/行集保持锁定状态,而没有活动的应用程序实例正在运行。 他的第一个猜测是,在事务期间发生了错误,并且没有带回滚的try-catch-block(但绝对不是这种情况,因为存在正确的错误处理)。 如果我在DbTransaction.Commit();之前在调试器中设置了一个断点,我可以重现这种情况DbTransaction.Commit(); 然后从Windows任务管理器中终止该进程。 然后事务保持打开状态(我可以看到它运行DBCC OPENTRAN )并且仍然存在锁定,这会阻止进一步使用应用程序的新实例。

我的问题:我怎样才能安全地处理这样的情况 - 进程在事务启动后被终止并且没有机会提交/回滚事务? 据我所知,如果应用程序被任务管理器(“进程”选项卡)杀死,我无法识别。 那么我可以以某种方式自动中止事务(例如在一些超时后)或我还能做什么? 请帮忙。

也许你应该

SET XACT_ABORT ON 

所以如果出错,sql server会自动回滚当前事务。

http://technet.microsoft.com/de-de/library/ms188792.aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM