服务之间的 ServiceStack Ormlite 事务

ServiceStack Ormlite transaction between services

我在 ServiceStack 服务中执行相当复杂的保存操作时遇到了问题。 为了简化解释,该服务启动一个 Ormlite 事务并在其中通过 ResolveService 调用另一个服务:

public ApplicationModel Post(ApplicationModel request)
{
    using (IDbTransaction tr = Db.OpenTransaction())
    {
        using (var cases = ResolveService<CaseService>())
        {
            request.Case = cases.Post(request.Case);
        }
    }
    Db.Save<Application>(request.Application, true);
}

另一个服务 (CaseService) 也使用事务来执行其逻辑:

public CaseModel Post(CaseModel request)
{
    using (IDbTransaction tr = Db.OpenTransaction())
    {
        Db.Insert<Case>(request);
        Db.SaveAllReferences<CaseModel>(request);
    }
}

在更高层次的服务调用其他服务的类似情况下,抛出 "Timeout expired" 错误,到目前为止我还没有解决,尽管我密切监视 SQL 服务器死锁。

我的问题是,这是否是 using/sharing Ormlite 跨服务交易的正确方式,还是存在其他机制?

提前致谢。

你不应该有嵌套事务,而不是跨服务调用来执行数据库操作,你应该使用单独的 shared Repository 或可重用的扩展方法提取共享逻辑:

public static class DbExtensions
{
    public static void SaveCaseModel(this IDbConnection db,
        CaseModel case)
    {
        db.Insert<Case>(case);
        db.SaveAllReferences<CaseModel>(case);
    }
}

然后您的服务可以维护自己的事务,同时能够共享逻辑,例如:

public ApplicationModel Post(ApplicationModel request)
{
    using (var trans = Db.OpenTransaction())
    {
        Db.SaveCaseModel(request.Case);
        Db.Save<Application>(request.Application, true);
        trans.Commit();
    }
}

public CaseModel Post(CaseModel request)
{
    using (var trans = Db.OpenTransaction())
    {
        Db.SaveCaseModel(request);
        trans.Commit();
    }
}