Sql 检查事务中是否存在连接

Sql 检查事务中是否存在连接,sql,sql-server,Sql,Sql Server,我得到一个SqlConnection不支持并行事务。异常,并在连接尝试打开两个事务时提到它。这正是我正在做的。我认为嵌套事务还可以(我使用sqlite作为原型) 如何检查连接是否已在事务中?我正在使用Microsoft SQL Server数据库文件。是否从多个线程执行此操作?如果是这样,那么询问就没有帮助,因为在您询问的时间和您开始新事务的时间之间,其他线程可能已经开始了自己的事务。您需要使用连接池来避免这种争用情况。我认为,当您的代码不知道时,只有尝试一下。什么语言?经过搜索,我找到了另一种

我得到一个
SqlConnection不支持并行事务。
异常,并在连接尝试打开两个事务时提到它。这正是我正在做的。我认为嵌套事务还可以(我使用sqlite作为原型)


如何检查连接是否已在事务中?我正在使用Microsoft SQL Server数据库文件。

是否从多个线程执行此操作?如果是这样,那么询问就没有帮助,因为在您询问的时间和您开始新事务的时间之间,其他线程可能已经开始了自己的事务。您需要使用连接池来避免这种争用情况。

我认为,当您的代码不知道时,只有尝试一下。什么语言?

经过搜索,我找到了另一种语言。事实证明,您无法在ADO.NET中嵌套事务。尝试时,可能会启动两个不相关的事务,这会导致并行事务错误

要查看连接当前是否在事务中,您可以:

var com = yourConnection.CreateCommand();
com.CommandText = "select @@TRANCOUNT";
var trancount = com.ExecuteScalar();
这将返回嵌套事务的数量

请注意,您可以手动嵌套事务,而无需使用SqlTransaction对象。例如:

var com = yourConnection.CreateCommand();
com.CommandText = "BEGIN TRANSACTION";
com.ExecuteNonQuery();
com.CommandText = "BEGIN TRANSACTION";
com.ExecuteNonQuery();
com.CommandText = "INSERT INTO TestTable (name) values ('Joe');";
com.ExecuteNonQuery();
com.CommandText = "COMMIT TRANSACTION";
com.ExecuteNonQuery();
com.CommandText = "ROlLBACK TRANSACTION";
com.ExecuteNonQuery();

com.CommandText = "SELECT COUNT(*) FROM TestTable";
Console.WriteLine("Found {0} rows.", com.ExecuteScalar());

这将打印
0
,因为嵌套事务已完全中止。

您可以通过检查
cmd.transaction
是否为
null
来检查事务是否已打开

然后相应地包装代码,这样如果事务已经打开,那么调用函数将拥有该事务,并将适当地提交/回滚它

//开始事务,除非已经启动了事务
bool newTransaction=cmd.Transaction==null;
if(newTransaction)cmd.Transaction=cmd.Connection.BeginTransaction();
试一试{
//在这里做事
cmd.ExecuteNonQuery();
cmd.ExecuteNonQuery();
//如果这是我们的责任,那就承诺吧
if(newTransaction)cmd.Transaction.Commit();
}catch(SqlException-ex){
if(newTransaction&&cmd.Transaction!=null)cmd.Transaction.Rollback();
投掷;
}

然后父函数可以传入一个命令,并可以选择开始它自己的事务块,如果没有,则被调用函数将创建并提交一个事务块。

每个线程都有自己的连接。我调用一个开始事务的函数,然后在循环中调用另一个也开始事务的函数。子函数一直被调用,几乎在任何地方都被调用。第一种方法不太常见。@zombie24:然后有两种通用方法:(1)为每个线程创建和维护多个连接,或者(2)使用连接池。连接池是一件好事。1)已经在做了,我不确定2是什么,但查找它时,看起来我也在做。我需要一种方法,使我的嵌套事务(故意创建)不必麻烦开始另一个事务。我一直在使用subfunc,它需要一个事务。上面的一个没有,但是性能(sqlite)在那里有事务时更好。因此,为什么我故意将一个连接与两个/嵌套连接在一起transactions@acidzombie24:如果程序的构造使您知道何时已打开一个事务,并且不需要在子函数中打开另一个事务,则只需向子函数传递一个标志,表示“这次不打开事务”格雷格:我想那是我需要做的,但我希望我不需要这样做。(我喜欢sqlite内置的方式)。我想如果这是我需要做的,我会做的。事务是否跨一台服务器上的多个数据库?.NET和否。它只是一个与嵌套事务的连接。嵌套是必需的,外部是出于性能原因(1对25事务)。