服务之间的 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();
}
}
我在 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();
}
}