【问题标题】:Does ServiceStack's OrmLite support nested transactions? If so, how?ServiceStack 的 OrmLite 是否支持嵌套事务?如果是这样,怎么做?
【发布时间】:2014-03-17 08:10:44
【问题描述】:
我正在寻找一个包含事务的外部方法的工作示例,该方法调用也包含事务的内部方法。通常,这类事情是使用 TransactionScope 管理的,但这似乎不适用于 ServiceStack 的 OrmLite。
明确地说,我不是在寻找如何设置交易。我正在寻找如何设置嵌套事务,以便使用 OrmLite 在最外层事务中 enlist 进行最内层事务。
【问题讨论】:
标签:
c#
transactions
ormlite-servicestack
【解决方案1】:
我意识到这是一个老问题,但这是我偶然发现的。我的回答仅与 SqlServer 有关,因此可能因提供者而异。
同一连接上不能有 2 个事务。如果您尝试打开多个交易,您将收到InvalidOperationException: SqlConnection does not support parallel transactions.
您可以拥有来自不同连接的嵌套事务:
using (var db = dbFactory.Open())
using (var tran = db.OpenTransaction())
{
// operations on db...
using (var nestedDb = dbFactory.Open())
using (var nestedTran = nestedDb.OpenTransaction())
{ // .Rollback/.Commit as required }
}
如果您调用nestedTran.Commit() 和tran.Rollback(),则使用上述方法,那么尽管外部事务正在回滚,但在nestedTran 中所做的更改仍将保持不变。
但是,我使用 TransactionScope 进行了快速测试,它与 OrmLite.SqlServer 一起工作正常。