ServiceStack's OrmLite支持嵌套事务吗?如果有,怎么做呢?
本文关键字:如果 OrmLite 嵌套事务 支持 ServiceStack | 更新日期: 2023-09-27 17:50:31
我正在寻找一个外部方法的工作示例,该方法包含一个调用内部方法的事务,其中也包含一个事务。通常,这类事情是使用TransactionScope来管理的,但这似乎不适用于ServiceStack的OrmLite。
要清楚,我不是在寻找如何建立一个事务。我正在寻找如何设置嵌套的事务,使最内层的事务在最外层的事务中使用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一起工作很好。