Два параллельных TransactionScope, каждый со своим собственным соединением - PullRequest
3 голосов
/ 12 декабря 2010

Я пытаюсь выяснить, как TransactionScope работает с образцом кода, представляющего различные сценарии транзакций ...
Можете ли вы объяснить, что на самом деле происходит с датой, когда у меня есть 2 одновременных 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();
            }
        }
    }
}

1 Ответ

4 голосов
/ 12 декабря 2010

Области транзакции, которые вложены (и находятся в одном и том же потоке), становятся частью одной и той же транзакции (внешняя транзакция является определяющей областью для завершения) - при необходимости переводится в DTC.В вашем случае транзакции не кажутся вложенными, поэтому они не связаны.Это также должно означать, что владельцем является LTM, а не DTC, у которого меньше накладных расходов.

В результате, конечно, вам может потребоваться следить за блокировками и т.д. между ними, если они касаются одних и тех же данных.Тем более что в качестве области действия транзакции по умолчанию используется сериализуемая изоляция.

...