Как сохранить объем транзакции с помощью Task - PullRequest
0 голосов
/ 01 марта 2020

Я хочу запускать задачи в TransactionScope, я работаю с 400 000 записей на 80 задач сохранения (каждое сохранение 5000 записей). Это мой код:

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew, TimeSpan.MaxValue))
            {
                try
                {
                    var tasks = new List<Task>();
                    foreach (var empsGroup in empsGroups)
                    {
                       tasks.Add(Task.Run(() =>  
                          {  
                           //add save of 5000 records      
                          }

                     }

                    Task allTasks = Task.WhenAll(tasks.ToArray());
                    try
                    {
                        allTasks.Wait();
                    }
                    catch (Exception e)
                    {
                        scope.Dispose();
                    }

                    scope.Complete();

                }
                catch (Exception e)
                {
                    scope.Dispose();

                }
            }

Но я получил исключение:

message: System.Transactions.TransactionAbortedException: The transaction has aborted. ---> System.TimeoutException: Transaction Timeout
   --- End of inner exception stack trace ---
   at System.Transactions.TransactionStateAborted.BeginCommit(InternalTransaction tx, Boolean asyncCommit, AsyncCallback asyncCallback, Object asyncState)
   at System.Transactions.CommittableTransaction.Commit()
   at System.Transactions.TransactionScope.InternalDispose()
   at System.Transactions.TransactionScope.Dispose()

1 Ответ

1 голос
/ 01 марта 2020

У вас есть 3 варианта:

1) Увеличьте время ожидания. Возможно, вам придется увеличить его довольно высоко, и очень длительная транзакция может помешать другим использованиям данных.

2) Повысить производительность (например, добавить индексы или ЦП), чтобы соответствовать тайм-ауту. Это может оказаться невозможным, если вы перемещаете столько данных.

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

третий вариант будет моим первым выбором в большинстве случаев.

...