сделки с щеголеватый точка Нэт


Я хотел бы запустить несколько инструкций insert для нескольких таблиц. Я использую dapper.net. я не вижу никакого способа обработки транзакций с помощью dapper.net.

пожалуйста, поделитесь своими идеями о том, как использовать транзакции с dapper.net.

5 90

5 ответов:

вот фрагмент кода:

using System.Transactions;    
....    
using (var transactionScope = new TransactionScope())
{
    DoYourDapperWork();
    transactionScope.Complete();
}

обратите внимание, что вам нужно добавить ссылку на System.Transactions сборка, потому что по умолчанию на нее нет ссылки.

Я предпочел использовать более интуитивный подход, получая транзакцию непосредственно из соединения:

// This called method will get a connection, and open it if it's not yet open.
using (var connection = GetOpenConnection())
using (var transaction = connection.BeginTransaction())
{
    connection.Execute(
        "INSERT INTO data(Foo, Bar) values (@Foo, @Bar);", listOf5000Items, transaction);
    transaction.Commit();
}

вы должны быть в состоянии использовать TransactionScope так как Dapper работает просто ADO.NET командует.

using (var scope = new TransactionScope())
{
   // insert
   // insert
   scope.Complete();
}

учитывая все ваши таблицы находятся в одной базе данных, я не согласен с TransactionScope решение, предложенное в некоторых ответах здесь. См.этой ответ.

  1. TransactionScope обычно используется для распределенных транзакций; транзакции, охватывающие разные базы данных, могут находиться в разных системах. Это требует некоторых конфигураций на операционной системе и SQL Server, без которых это не будет работать. Это не рекомендуется, если все ваши запросы от одного экземпляра база данных.

  2. connection.BeginTransaction синтаксис ADO.NET для осуществления сделки (в C# VB.NET и т. д.) против единой базы данных. Это не работает в нескольких базах данных.

и connection.BeginTransaction() - Это лучший способ пойти.

даже лучший способ обработки транзакции-реализовать UnitOfWork, как описано в этой ответ.

ответ Даниэля сработал, как и ожидалось для меня. Для полноты, вот фрагмент, который демонстрирует фиксацию и откат с помощью области транзакции и dapper:

using System.Transactions;
    // _sqlConnection has been opened elsewhere in preceeding code 
    using (var transactionScope = new TransactionScope())
    {
        try
        {
            long result = _sqlConnection.ExecuteScalar<long>(sqlString, new {Param1 = 1, Param2 = "string"});

            transactionScope.Complete();
        }
        catch (Exception exception)
        {
            // Logger initialized elsewhere in code
            _logger.Error(exception, $"Error encountered whilst executing  SQL: {sqlString}, Message: {exception.Message}")

            // re-throw to let the caller know
            throw;
        }
    } // This is where Dispose is called