C# TransactionScope - L2E

Действительно ли стоит использовать Систему. Транзакции. TransactionScope на Linq к Объектам?

На документации MS это говорит, что SQL звонит в ObjectContext. SaveChanges () являются всеми одновременно транзакция внутренне.

У нас есть 1 соединение с базой данных, которое является локальной базой данных SQLite по файловой системе. Мы просто хотим удостовериться, что все наши операции к базе данных являются атомарными, нам нужен TransactionScope? Т.Е. то, когда мы призываем, некоторые удаляют, обновляет, вставляет, и т.д., мы хотим, чтобы они все произошли или ни один вообще.

5
задан jonathanpeppers 2 March 2010 в 15:02
поделиться

3 ответа

Jon, нет, вам не нужно использовать TransactionScope. Оптимистический параллелизм автоматически обрабатывается Linq. Пример кода в приведенной вами ссылке объясняет это довольно хорошо, вам не нужно самостоятельно откатывать транзакции. Я бы использовал тот же код, что и в примере:

    try
    {
        // Try to save changes, which may cause a conflict.
        int num = context.SaveChanges();
        Console.WriteLine("No conflicts. " +
            num.ToString() + " updates saved.");
    }
    catch (OptimisticConcurrencyException)
    {
        // Resolve the concurrency conflict by refreshing the 
        // object context before re-saving changes. 
        context.Refresh(RefreshMode.ClientWins, orders);

        // Save changes.
        context.SaveChanges();
        Console.WriteLine("OptimisticConcurrencyException "
        + "handled and changes saved");
    }

Обратите внимание на refresh, re-save, которые обрабатывают вашу проблему. Вы можете проверить это, выбросив исключение из блока try.

Best Regards

3
ответ дан 15 December 2019 в 00:59
поделиться

Если вы хотите включить больше, чем ObjectContext.SaveChanges в одну транзакцию (например, чтение данных, которые вы собираетесь изменить, а также изменения), вам необходимо использовать TransactionScope .

1
ответ дан 15 December 2019 в 00:59
поделиться

Вы можете использовать следующий код, если вам нужно сделать то, что говорит Ричард (хотя это кажется маловероятным):

TransactionManager transactionManager = null;

try
{
    bool isBorrowedTransaction = ConnectionScope.Current.HasTransaction;
    transactionManager = ConnectionScope.ValidateOrCreateTransaction(true);

    //MANY SAVES

    if (!isBorrowedTransaction && transactionManager != null && transactionManager.IsOpen)
        transactionManager.Commit();
}
catch (Exception ex)
{
    if (transactionManager != null && transactionManager.IsOpen)
        transactionManager.Rollback();
    log.Error("An unexpected Exception occurred", ex);
    throw;
}
0
ответ дан 15 December 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: