В момент открытия второго соединения ADO.Net в области транзакции оба соединения будут переведены в DTC. даже если это новое соединение с той же БД, не имеет значения. Доступность базы данных только для чтения также не имеет к этому никакого отношения и не может иметь к этому никакого отношения. Во-первых, соединения не зависят от базы данных, поскольку они могут изменить базу данных после открытия. Во-вторых, база данных только для чтения может выполнять много операций записи (например, может вызывать readonlydb.dbo.myProcedure, и внутри процедуры я могу обновить writabledb.dbo.table).
Если вы хотите избежать DTC, вы должны использовать разные области транзакций между двумя уровнями доступа (т. Е. Создать новую область с помощью RequireNew).
Обновление
Если возможно выполнить чтение вне области видимости, было бы идеально:
// read some from source db using Linq2Sql
// read some more from source db using Linq2Sql
using(var scope = new TransactionScope())
{
// transform source info
// update destination
// transform source info
// update destination
}
Я понимаю, что это крайне маловероятно, поскольку, вероятно, второй набор операций чтения обычно зависит от результата первого преобразования / обновления. Таким образом, вы лучше подавите объем при чтении:
using(var scope = new TransactionScope())
{
using(var nada= new TransactionScope(TransactionScopeOption.Supress))
{
// read some from source db using Linq2Sql
// transform source info
}
// update destination
using(var nada= new TransactionScope(TransactionScopeOption.Supress))
{
// read some more from source db using Linq2Sql
// transform source info
}
// update destination
}
Кстати, я предполагаю, что «чтение некоторых данных с использованием linq» означает, что вы фактически перечисляете запрос, а не просто создаете выражение запроса и используете выражение позже. Я не знаю точно, как область транзакции взаимодействует с выражением запроса, но я предполагаю, что область применяется к выполнению запроса, а не к объявлению.