gpt4 book ai didi

sql-server - ServiceStack Ormlite 服务之间的事务

转载 作者:行者123 更新时间:2023-12-03 03:21:24 25 4
gpt4 key购买 nike

我在 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);
}
}

在类似的情况下,更高层次的服务调用其他服务时会抛出“超时已过期”错误,尽管我密切监视 SQL Server 是否存在死锁,但到目前为止我还无法解决该错误。

我的问题是,这是否是跨服务使用/共享 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();
}
}

关于sql-server - ServiceStack Ormlite 服务之间的事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28095412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com