ServiceStack's OrmLite支持嵌套事务吗?如果有,怎么做呢?

本文关键字:如果 OrmLite 嵌套事务 支持 ServiceStack | 更新日期: 2023-09-27 17:50:31

我正在寻找一个外部方法的工作示例,该方法包含一个调用内部方法的事务,其中也包含一个事务。通常,这类事情是使用TransactionScope来管理的,但这似乎不适用于ServiceStack的OrmLite。

要清楚,我不是在寻找如何建立一个事务。我正在寻找如何设置嵌套的事务,使最内层的事务在最外层的事务中使用OrmLite。

ServiceStack's OrmLite支持嵌套事务吗?如果有,怎么做呢?

我知道这是一个老问题,但它是我偶然发现的东西。我的答案只与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一起工作很好。