给定以下代码结构
func1()
{
using (TransactionScope1)
using (connection1)
{
"insert into table A"
func2()
"select from table B"
}
}
func2()
{
using (TransactionScope2)
using (connection2)
{
foreach (x in y)
{
"select from table A"
"insert into table B"
}
}
}
如果TransactionScope2
已回滚,则"select from table B"
失败并显示The operation is not valid for the state of the transaction
. 据我了解TransactionScope2
,加入第一个并将它们都回滚。所以我将它更改为使用 来创建它TransactionScopeOption.RequiresNew
,这反过来导致超时"select from table A"
。
这个想法是让第二个事务从第一个事务读取数据,但独立提交/回滚。我的猜测是IsolationLevel
需要以某种方式改变,但我并不真正理解它的选项。
编辑:
如果我们将 and 命名为 2,也许更容易理解问题func1
。基本上func2
是 DAL 功能,并且func1
是它的单元测试。func1
创建一些示例数据,func2
对其执行一些操作,检查结果然后回滚整个事情,无论在哪里func2
成功与否。
EDIT2:在阅读了更多内容后,我认为以下代码应该可以工作,但由于某种原因,我仍然会超时select from table A
func1()
{
using (var txn = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted }))
using (connection1)
{
"insert into table A"
func2()
"select from table B"
}
}
func2()
{
using (var txn = new TransactionScope(TransactionScopeOption.RequiresNew))
using (connection2)
{
foreach (x in y)
{
"select from table A"
"insert into table B"
}
}
}