SqlTransaction vs TransactionScope после установления SqlConnection - PullRequest
0 голосов
/ 25 марта 2019

Я знаю, что есть ряд вопросов по теме SqlTransactions против TransactionScopes, но я не видел примеров использования TransactionScopes после открытия Sqlconnections.

Я пишу программу, которая будет иметь несколько вызовов SQL для обновления базы данных. Эти команды выполняются в нескольких транзакциях в соответствии с логическими блоками работы. т.е.

using (SqlConnection conn = new SqlConnection(...))
{
    conn.Open();

    using(SqlTransaction tran = conn.BeginTransaction())
    {
        string sql = ...;
        conn.Execute(sql, transaction: tran);

        sql = ...;
        conn.Execute(sql, transaction: tran)

        tran.Commit();
    }

    using(SqlTransaction tran2 = conn.BeginTransaction())
    {
        string sql2 = ...;
        conn.Execute(sql2, transaction: tran2);

        sql2 = ...;
        conn.Execute(sql2, transaction: tran2)

        tran2.Commit();
    }
}

Из того, что я прочитал, в целом TransactionScope предпочтительнее SqlTransaction, но во всех примерах, которые я видел, TransactionScope инициализируется до SqlConnection. Также, согласно комментарию к этому ответу , если сначала открыто соединение, то вам необходимо подключить его к транзакции. Мне интересно, будет ли лучше придерживаться SqlTransactions в этом случае, или я должен рефакторинг?

Если бы мне пришлось провести рефакторинг, я мог бы видеть возможность включения соединения в каждую транзакцию (хотя я не уверен, можно ли подключить соединение к более чем одной транзакции, и я даже не уверен, возможно ли что-то подобное использование TransactionScope в качестве TransactionScope.Transaction не существует и conn.EnlistTransaction (транзакция) не работает.) или, возможно, инвертирование блоков использования для повторной инициализации соединения в каждой транзакции. Примерно так:

using (TransactionScope scope = new TransactionScope())
{
    using (SqlConnection conn = new SqlConnection(...))
    {
        string sql = ...;
        conn.Execute(sql);

        sql = ...;
        conn.Execute(sq)
    }

    scope.Complete();
}

using (TransactionScope scope2 = new TransactionScope())
{
    using (SqlConnection conn2 = new SqlConnection(...))
    {
        string sql2 = ...;
        conn2.Execute(sql2);

        sql2 = ...;
        conn2.Execute(sql2)
    }

    scope2.Complete();
}

но я не уверен, к какому типу попадания / справки это приведет с точки зрения управления ресурсами, поскольку соединения будут использовать одну и ту же connectionString. Это приведет к ненужным соединениям? Есть ли рекомендуемая структура для кода такого типа?

Заранее спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...