无法执行事务操作,因为有待处理的请求正在运行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法执行事务操作,因为有待处理的请求正在运行相关的知识,希望对你有一定的参考价值。
背景
我有一些代码打开一个SQL连接,开始一个事务并在数据库上执行一些操作。此代码从DB(dequeue)创建一个对象,获取一些值并将其保存回来。整个操作需要在交易中进行。所有代码在没有事务的情况下完美运行。
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
var transaction = connection.BeginTransaction();
try
{
var myObject = foo.Dequeue(connection, transaction);
var url = myObj.GetFilePathUri(connection, transaction);
//some other code that sets object values
myObj.SaveMessage(connection, transaction);
transaction.Commit(); //error here
}
catch(Exception ex)
{
transaction.Rollback();
//logging
}
finally
{
//cleanup code
}
}
出列方法代码
public foo Dequeue(SqlConnection connection, SqlTransaction transaction)
{
using (var command = new SqlCommand(DEQUEUE_SPROC, connection) {CommandType = CommandType.StoredProcedure, Transaction = transaction})
{
var reader = command.ExecuteReader();
if (reader.HasRows)
{
reader.Read();
ID = (Guid) reader["ID"];
Name = reader["Name"].ToString();
return this;
}
return null;
}
}
获取路径代码
public string GetFilePathUri(SqlConnection connection, SqlTransaction transaction)
{
using (var command = new SqlCommand(FILEPATH_SPROC, connection) {CommandType = CommandType.StoredProcedure, Transaction = transaction})
{
var reader = command.ExecuteReader();
if (reader.HasRows)
{
reader.Read();
return reader["Path"].ToString();
}
return "";
}
}
保存代码
public void SaveMessage(SqlConnection connection, SqlTransaction transaction)
{
using (var command = new SqlCommand(SAVE_SPROC, connection) {CommandType = CommandType.StoredProcedure, Transaction = transaction})
{
command.Parameters.Add("@ID", SqlDbType.UniqueIdentifier).Value = ID;
command.Parameters.Add("@Name", SqlDbType.VarChar).Value = Name;
//other object params here
command.ExecuteNonQuery();
}
}
问题
当调用transaction.Commit()时,我收到以下错误:
无法执行事务操作,因为存在处理此事务的待处理请求。
我究竟做错了什么?
编辑:快速编辑说我已经在SO上阅读了有关此问题的其他问题,但找不到任何与ADO.net相关的问题
答案
我之前遇到过这个问题,问题是读者需要关闭。试试这个:
public foo Dequeue(SqlConnection connection, SqlTransaction transaction)
{
using (var command = new SqlCommand(DEQUEUE_SPROC, connection) {CommandType = CommandType.StoredProcedure, Transaction = transaction})
{
var reader = command.ExecuteReader();
if (reader.HasRows)
{
reader.Read();
ID = (Guid) reader["ID"];
Name = reader["Name"].ToString();
reader.Close();//Closing the reader
return this;
}
return null;
}
}
public string GetFilePathUri(SqlConnection connection, SqlTransaction transaction)
{
string filePathUri = "";
using (var command = new SqlCommand(FILEPATH_SPROC, connection) {CommandType = CommandType.StoredProcedure, Transaction = transaction})
{
var reader = command.ExecuteReader();
if (reader.HasRows)
{
reader.Read();
filePathUri = reader["Path"].ToString();
}
reader.Close();//Closing the reader
}
return filePathUri;
}
另一答案
当我忘记在执行数据库调用的异步方法上使用await时遇到了这个问题 - 在事务运行时正在处理连接,因为程序在尝试处理所有内容之前没有等待查询完成。
以上是关于无法执行事务操作,因为有待处理的请求正在运行的主要内容,如果未能解决你的问题,请参考以下文章
无法执行操作,因为链接服务器的 OLE DB 提供程序“SQLNCLI11”无法开始分布式事务
Spring Boot - Mysql Driver - JPA - 在服务器运行发布请求很长时间后显示无法打开 JPA EntityManager 进行事务处理
无法执行该操作,因为链接服务器 "xxxxx" 的 OLE DB 访问接口 "SQLNCLI" 无法启动分布式事务