TransactionScope不能与linux

时间:2018-03-03 11:10:17

标签: c# .net transactions .net-core

我正在开发一个基于asp.net核心mvc的博客项目,并尝试在ubuntu 16.04 LTS x86-64上部署我的项目。

在将对象插入sql server时,使用transactionScope和dapper时遇到了空引用异常。

SQL Server版本是:在Windows 2012SP1系统上运行的12.0.4100.1。 并且代码在Windows 10(OS Build 17074.1002)上正常运行。 但是当我将项目部署到Ubuntu时,它会抛出空引用异常。

例外情况如下:

  

{System.NullReferenceException:对象引用未设置为对象的实例。在   System.Data.ProviderBase.DbConnectionPool.DeactivateObject(DbConnectionInternal   obj)at   System.Data.ProviderBase.DbConnectionPool.PutObject(DbConnectionInternal   obj,Object owningObject)at   System.Data.ProviderBase.DbConnectionInternal.CloseConnection(的DbConnection   owningObject,DbConnectionFactory connectionFactory)at   System.Data.SqlClient.SqlConnection.CloseInnerConnection()at   System.Data.SqlClient.SqlConnection.Close()at   Dapper.SqlMapper.d__64 1.MoveNext()in   C:\ projects \ dapper \ Dapper \ SqlMapper.Async.cs:第1191行   ---从抛出异常的先前位置开始的堆栈跟踪结束--- at   System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()at   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(任务任务)
  在System.Runtime.CompilerServices.TaskAwaiter 1.GetResult()at   Autyan.NiChiJou.Repository.Dapper.BaseDapperRepository   1.d__22.MoveNext()在/home/alex/Documents/Github/Autyan.NiChiJou/src/Autyan.NiChiJou.Repository.Dapper/BaseDapperRepository.cs:line   167   ---从抛出异常的先前位置开始的堆栈跟踪结束--- at   System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()at   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(任务任务)
  在System.Runtime.CompilerServices.TaskAwaiter 1.GetResult()at   Autyan.NiChiJou.Repository.Dapper.LongKeyDapperRepository   1.d__1.MoveNext()在/home/alex/Documents/Github/Autyan.NiChiJou/src/Autyan.NiChiJou.Repository.Dapper/LongKeyDapperRepository.cs:line   23   ---从抛出异常的先前位置开始的堆栈跟踪结束--- at   System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()at   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(任务任务)
  在System.Runtime.CompilerServices.TaskAwaiter 1.GetResult()at   Autyan.NiChiJou.Service.Blog.ArticleService.d__10.MoveNext()   在   /home/alex/Documents/Github/Autyan.NiChiJou/src/Autyan.NiChiJou.Service.Blog/ArticleService.cs:line   39}

抛出异常的代码是这样的:

using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
    var create = await ArticleRepo.InsertAsync(article);
    if (create <= 0)
    {
        return Failed<Article>("create article failed");
    }
    create = await ContentRepo.InsertAsync(new ArticleContent
    {
        ArticleId = create,
        Content = content
    });
    if (create <= 0)
    {
        return Failed<Article>("create articleContent failed");
    }
    scope.Complete();
}

我试图删除transactionScope,之后,我的代码运行得很好

新代码就像:

var create = await ArticleRepo.InsertAsync(article);
if (create <= 0)
{
    return Failed<Article>("create article failed");
}
create = await ContentRepo.InsertAsync(new ArticleContent
{
    ArticleId = create,
    Content = content
});
if (create <= 0)
{
    return Failed<Article>("create articleContent failed");
}

我是否以错误的方式使用trancsationScope?或者它只是来自dotnet核心本身的一个错误?

1 个答案:

答案 0 :(得分:0)

这是因为当await结束时,分配给继续执行await之后的语句的线程已经丢失了原始执行线程所拥有的事务上下文。

将您的Txn范围定义为:

using (var scope = new TransactionScope(..., TransactionScopeAsyncFlowOption.Enabled))