我见过代码示例,其中TransactionScope嵌套在另一个内,如this
using(TransactionScope scope1 = new TransactionScope())
{
try
{
//Start of non-transactional section
using(TransactionScope scope2 = new
TransactionScope(TransactionScopeOption.Suppress))
{
//Do non-transactional work here
}
//Restores ambient transaction here
}
catch
{}
//Rest of scope1
}
我可以在这里理解Supress
的使用,但据我所知Required
只是与外部事务合并,所以如果有什么失败,整个事情都会失败,那么重点是什么?我在这里错过了什么吗?
修改 为了清楚起见,我想强调抑制选项I(想想我:-))理解,这在MSDN文档中有解释。我的问题是默认必需选项;也许我不完全理解,但如果交易B嵌套在交易A中,那么如果A失败或 B失败,那么A 和 B都将被回滚,这是如果我从来没有把B放在交易中那么一样。
所以重写的问题是'使用默认的必需选项嵌套交易有什么区别,而不是全部执行?'
答案 0 :(得分:0)
想一想:
using(TransactionScope scope1 = new TransactionScope())
{
//i insert some records in tabe A
try
{
using(TransactionScope scope2 = new
TransactionScope(TransactionScopeOption.Suppress))
{
// I insert some records in table B
scope2.Complete()
}
//I insert some records in table C
}
catch
{}
//I Update some records in table D
//I Delete some records of table E
// Here we have an exception being thrown
scope1.Complete()
}
运行代码后
表A,C,D,E的所有更改都将回滚
表B的所有更改都将提交