Я знаю, что есть ряд вопросов по теме 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. Это приведет к ненужным соединениям? Есть ли рекомендуемая структура для кода такого типа?
Заранее спасибо!