请记住:被抑制的 TransactionScope 不需要“完成”
没有交易。
例如,您可以在此处执行此操作:
static void TestMethod()
{
using (Model1 ctx = new Model1())
{
Console.WriteLine("Count = {0}", ctx.Test.Count());
Console.WriteLine("Has Value 'Test1' = {0}", ctx.Test.Count(x => x.Value == "Test1"));
Console.WriteLine("Has Value 'Test2' = {0}", ctx.Test.Count(x => x.Value == "Test2"));
}
using (Transactions.TransactionScope scope = new Transactions.TransactionScope())
{
using (Model1 ctx = new Model1())
{
ctx.Test.Add(new Test { Value = "Test1" });
Console.WriteLine("Add 'Test1'");
Console.WriteLine("SaveChanges = {0}", ctx.SaveChanges());
}
using (Transactions.TransactionScope scope2 = new Transactions.TransactionScope(Transactions.TransactionScopeOption.Suppress))
{
using (Model1 ctx = new Model1())
{
ctx.Test.Add(new Test { Value = "Test2" });
Console.WriteLine("Add 'Test2'");
Console.WriteLine("SaveChanges = {0}", ctx.SaveChanges());
}
}
}
using (Model1 ctx = new Model1())
{
Console.WriteLine("Count = {0}", ctx.Test.Count());
Console.WriteLine("Has Value 'Test1' = {0}", ctx.Test.Count(x => x.Value == "Test1"));
Console.WriteLine("Has Value 'Test2' = {0}", ctx.Test.Count(x => x.Value == "Test2"));
}
}
输出:
- 计数 = 1
- 具有值“Test1”= 0
- 具有值“Test2”= 0
- 添加“测试1”
- 保存更改 = 1
- 添加“测试2”
- 保存更改 = 1
- 计数 = 1
- 具有值“Test1”= 0
- 具有值“Test2”= 1
这意味着受抑制范围内的每个查询都不能仅通过处置范围来回滚。
但如果你这样做:
static void TestMethod()
{
using (Model1 ctx = new Model1())
{
Console.WriteLine("Count = {0}", ctx.Test.Count());
Console.WriteLine("Has Value 'Test1' = {0}", ctx.Test.Count(x => x.Value == "Test1"));
Console.WriteLine("Has Value 'Test2' = {0}", ctx.Test.Count(x => x.Value == "Test2"));
Console.WriteLine("Has Value 'Test3' = {0}", ctx.Test.Count(x => x.Value == "Test3"));
}
using (Transactions.TransactionScope scope = new Transactions.TransactionScope())
{
using (Model1 ctx = new Model1())
{
ctx.Test.Add(new Test { Value = "Test1" });
Console.WriteLine("Add 'Test1'");
Console.WriteLine("SaveChanges = {0}", ctx.SaveChanges());
}
using (Transactions.TransactionScope scope2 = new Transactions.TransactionScope(Transactions.TransactionScopeOption.Suppress))
{
using (Model1 ctx = new Model1())
{
ctx.Test.Add(new Test { Value = "Test2" });
Console.WriteLine("Add 'Test2'");
Console.WriteLine("SaveChanges = {0}", ctx.SaveChanges());
}
using (Transactions.TransactionScope scope3 = new Transactions.TransactionScope())
{
using (Model1 ctx = new Model1())
{
ctx.Test.Add(new Test { Value = "Test3" });
Console.WriteLine("Add 'Test3'");
Console.WriteLine("SaveChanges = {0}", ctx.SaveChanges());
}
scope3.Complete();
}
}
}
using (Model1 ctx = new Model1())
{
Console.WriteLine("Count = {0}", ctx.Test.Count());
Console.WriteLine("Has Value 'Test1' = {0}", ctx.Test.Count(x => x.Value == "Test1"));
Console.WriteLine("Has Value 'Test2' = {0}", ctx.Test.Count(x => x.Value == "Test2"));
Console.WriteLine("Has Value 'Test3' = {0}", ctx.Test.Count(x => x.Value == "Test3"));
}
}
输出:
- 计数 = 0
- 具有值“Test1”= 0
- 具有值“Test2”= 0
- 具有值“Test3”= 0
- 添加“测试1”
- 保存更改 = 1
- 添加“测试2”
- 保存更改 = 1
- 添加“测试3”
- 保存更改 = 1
- 计数 = 2
- 具有值“Test1”= 0
- 具有值“Test2”= 1
- 具有值“Test3”= 1
你可以看到:“scope”和“scope3”之间没有关系,因为“scope3”提交了它的变化。
“scope2”也提交其更改,因为“scope2”是一个抑制范围。