gpt4 book ai didi

c# - 如果客户端进程在事务开始后被终止,数据库表将保持锁定状态

转载 作者:太空狗 更新时间:2023-10-29 21:58:06 26 4
gpt4 key购买 nike

我有一个 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(); 之前在调试器中设置断点,然后从 Windows 任务管理器终止进程。然后事务保持打开状态(我可以看到它正在运行 DBCC OPENTRAN)并且保持锁定状态,禁止进一步使用应用程序的新实例。

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

最佳答案

也许你应该

SET XACT_ABORT ON 

所以sql server在出错的情况下会自动回滚当前事务。

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

关于c# - 如果客户端进程在事务开始后被终止,数据库表将保持锁定状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19678462/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com