我正在尝试找出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是所有者,这将减少开销。

因此,当然,如果它们接触相同的数据,则可能需要注意它们之间的阻塞等。特别是由于事务作用域默认为可序列化隔离。

10-06 02:16