我正在寻找一个实际的工作示例,其中包含一个事务的外部方法调用一个也包含事务的内部方法。通常使用TransactionScope来管理这种情况,但这似乎不能与ServiceStack的OrmLite一起使用。
明确一点,我不是在寻找如何设置事务。我正在寻找如何设置嵌套事务,使得最内层的事务能够使用OrmLite参与最外层的事务。
明确一点,我不是在寻找如何设置事务。我正在寻找如何设置嵌套事务,使得最内层的事务能够使用OrmLite参与最外层的事务。
我知道这是一个老问题,但这是我偶然发现的。我的答案只与SqlServer相关,所以可能因提供程序而异。
在同一连接上无法有两个事务。如果尝试打开多个事务,将会出现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正常工作。