当分配给命令的连接在未决的本地事务中时,c#ExecuteReader要求该命令具有事务

时间:2018-07-05 14:11:07

标签: c# sql-server

我遇到了相同的错误,看到多个线程,在谷歌搜索了2天后,我似乎无法解决该问题,而且我也看不出为什么。我简化了一些与sqltransaction部分无关的代码。

@OneToOne(fetch = FetchType.LAZY,cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "REFRESH_TOKEN_ID")
private RefreshToken refreshToken;

1 个答案:

答案 0 :(得分:0)

您忘记在command.Transaction = sqlTran;中的command.ExecuteNonQuery();之前添加PerformTransaction()

public static void PerformTransaction(HttpRequestMessage req, string query, SqlConnection conn, TraceWriter log, SqlTransaction sqlTran, SqlCommand command)
{
     try
        {
            command.Transaction = sqlTran;
            command.ExecuteNonQuery();
            log.Info("Query Executed Successfully");
        }
     catch
        {
            log.Info("Transaction Execution Error");
            sqlTran.Rollback();
            throw;
        }
}

编辑:实际上,您的问题是,当sqlTran的第一笔交易尚未完成时,您正在尝试对多个交易使用相同的sqlTran。换句话说,您在调用command.ExecuteNonQuery()

之前已经启动了另一个未提交的事务

sqlTran.Commit()try之后,尝试将Command.ExecuteNonQuery()移动到PerformTransaction()块内。这样,在尝试执行另一个事务之前,将提交当前事务。

public static void PerformTransaction(HttpRequestMessage req, string query, SqlConnection conn, TraceWriter log, SqlTransaction sqlTran, SqlCommand command)
{
     try
        {
            command.ExecuteNonQuery();
            log.Info("Query Executed Successfully");
            sqlTran.Commit();
            log.Info("Transaction Commited Successfully");
        }
     catch
        {
            log.Info("Transaction Execution Error");
            sqlTran.Rollback();
            throw;
        }
}