我正在尝试找出TransactionScope如何处理代表不同交易场景的示例代码...
当我有两个并发的TransactionScopes且每个都有自己的连接时,您能否解释一下日期的实际变化?像下面的示例代码:
internal class Program
{
private const int Count = 20;
private static readonly Random Random = new Random();
private static void Main(string[] args)
{
var task1 = new Task(Task1);
var task2 = new Task(Task2);
task1.Start();
task2.Start();
Console.ReadLine();
}
private static void Task1()
{
var connection = new EntityConnection("name=ModelContainer");
using (var transaction = new TransactionScope())
{
DoWork(connection);
transaction.Complete();
}
}
private static void Task2()
{
var connection = new EntityConnection("name=ModelContainer");
using (var transaction = new TransactionScope())
{
DoWork(connection);
transaction.Complete();
}
}
private static void DoWork(EntityConnection connection)
{
connection.Open();
using (var context = new ModelContainer(connection))
{
List<SyncData> list = context.SyncDataSet.ToList();
for (int i = 0; i < Count; i++)
{
list[i].Knowledge.Version = Random.Next(200);
context.SaveChanges();
}
}
}
}
最佳答案
嵌套的事务作用域(在同一线程上)成为同一事务的一部分(外部事务是完成的定义范围)-如果需要,升级为DTC。在您的情况下,事务似乎没有嵌套,因此它们是无关的。这也应该意味着LTM而不是DTC是所有者,这将减少开销。
因此,当然,如果它们接触相同的数据,则可能需要注意它们之间的阻塞等。特别是由于事务作用域默认为可序列化隔离。