Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Одна Транзакция для нескольких Баз.  [new]
potkin
Member

Откуда: Ungvar
Сообщений: 1039
Пользуюсь C# (от Майкрософта).
Подскажите пожалуйста:
Как в контексте одной транзакции сохранить данные в несколько Баз. (тоесть: одна транзакция для нескольких SqlConnection) ???
26 сен 09, 16:06    [7711552]     Ответить | Цитировать Сообщить модератору
 Re: Одна Транзакция для нескольких Баз.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31168
potkin
Пользуюсь C# (от Майкрософта).
Подскажите пожалуйста:
Как в контексте одной транзакции сохранить данные в несколько Баз. (тоесть: одна транзакция для нескольких SqlConnection) ???
Никак.

Можно в контексте одной транзакции сохранить данные в несколько Баз в одном SqlConnection.
26 сен 09, 16:12    [7711563]     Ответить | Цитировать Сообщить модератору
 Re: Одна Транзакция для нескольких Баз.  [new]
potkin
Member

Откуда: Ungvar
Сообщений: 1039
alexeyvg
Можно в контексте одной транзакции сохранить данные в несколько Баз в одном SqlConnection.


А это как ???
Насколько знаю одно "SqlConnection" для соединения с одной БД.
А как заставить одно "SqlConnection" соединятся с несколькими БД. Менять строку соединения ??? Так:

using (TransactionScope scope = new TransactionScope())
{
  using (SqlConnection connection1 = new SqlConnection(connectString1))
  {
   ...
  }
  using (SqlConnection connection1 = new SqlConnection(connectString2))
  {
   ...
  }

  ...

scope.Complit();
}

???
26 сен 09, 16:19    [7711569]     Ответить | Цитировать Сообщить модератору
 Re: Одна Транзакция для нескольких Баз.  [new]
potkin
Member

Откуда: Ungvar
Сообщений: 1039
или так:

SqlTransaction trans = null;
//1.=====
SqlConnection con = new SqlConnection(constr1);
con.Open();
trans = con.BeginTransaction();
SqlCommand cmd = new SqlCommand(str_SQL1, con, trans);
cmd.ExecuteNonQuery();
con.Close();
//1.=====
con = new SqlConnection(constr2);
SqlCommand cmd = new SqlCommand(str_SQL2, con, trans);
con.Open();
cmd.ExecuteNonQuery();
con.Close();

???

Не работает. Выдаёт ошибку:

System.InvalidOperationException: This SqlTransaction has completed; it is no longer usable.
26 сен 09, 16:37    [7711583]     Ответить | Цитировать Сообщить модератору
 Re: Одна Транзакция для нескольких Баз.  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
potkin,

А такое обращение к объектам
dbname.schema_name.table_name
не канает, что ли?
26 сен 09, 16:43    [7711587]     Ответить | Цитировать Сообщить модератору
 Re: Одна Транзакция для нескольких Баз.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31168
potkin
alexeyvg
Можно в контексте одной транзакции сохранить данные в несколько Баз в одном SqlConnection.


А это как ???
Насколько знаю одно "SqlConnection" для соединения с одной БД.
Соединение будет с одной БД, но работать можно во многих.

Нужно будет в запросах обращаться к другим базам в формате База.Владелец.Объект

Возможно, можно так же сменить текущую базу изменением свойства объекта SqlConnection или послав команду:
use ИмяБазыДанных

Хотя нет, свойство Database у SqlConnection не меняется.

Так что пробуйте use.
26 сен 09, 16:45    [7711594]     Ответить | Цитировать Сообщить модератору
 Re: Одна Транзакция для нескольких Баз.  [new]
Denis Reznik
Member

Откуда: Киев
Сообщений: 156
Похоже вам нужна распределённая транзакция. Насколько я помню, если вы откроете несколько соединений внутри TransactionScope, то будет инициализирована распределённая транзакция. Но это потребляет больше ресурсов чем локальная транзакция и увеличивается время блокировки таблиц. Может быть стоит рассмотреть другие сценарии внесения изменений? например репликацию или мониторинг изменений данных и перенос в другую базу по расписанию (или ещё что-нибудь в зависимости от вашей ситуации и требований).
26 сен 09, 17:27    [7711644]     Ответить | Цитировать Сообщить модератору
 Re: Одна Транзакция для нескольких Баз.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31168
Denis Reznik
Похоже вам нужна распределённая транзакция. Насколько я помню, если вы откроете несколько соединений внутри TransactionScope, то будет инициализирована распределённая транзакция. Но это потребляет больше ресурсов чем локальная транзакция и увеличивается время блокировки таблиц. Может быть стоит рассмотреть другие сценарии внесения изменений? например репликацию или мониторинг изменений данных и перенос в другую базу по расписанию (или ещё что-нибудь в зависимости от вашей ситуации и требований).
Если автору нужно именно то, о чём он спрашивал, то лучьше обойтись без распределённой транзакции, репликации и переноса, сделав так, как ему написали выше.

Конечно, если под 2-мя базами подразумевались, например, файл dbf и таблица Excel, то решения должны быть другими :-)
26 сен 09, 17:32    [7711653]     Ответить | Цитировать Сообщить модератору
 Re: Одна Транзакция для нескольких Баз.  [new]
Denis Reznik
Member

Откуда: Киев
Сообщений: 156
alexeyvg,

в том, то и дело, что не до конца понятна ситуация автора :) а репликацию я привёл так, для примера. Например если суть транзакции заключается в том, чтобы внести одинаковые изменения в несколько баз, то репликация будет лучшим решеним чем транзакция
26 сен 09, 17:43    [7711677]     Ответить | Цитировать Сообщить модератору
 Re: Одна Транзакция для нескольких Баз.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31168
Denis Reznik
alexeyvg,

в том, то и дело, что не до конца понятна ситуация автора :) а репликацию я привёл так, для примера. Например если суть транзакции заключается в том, чтобы внести одинаковые изменения в несколько баз, то репликация будет лучшим решеним чем транзакция
Это да, я согласен.
26 сен 09, 17:55    [7711691]     Ответить | Цитировать Сообщить модератору
 Re: Одна Транзакция для нескольких Баз.  [new]
potkin
Member

Откуда: Ungvar
Сообщений: 1039
Поменял "на ходу", не закрывая соединения Базу данных так:
con1.ChangeDatabase(DB_NAME_2);
И всё заработало !!!
Спасибо всем !!!
26 сен 09, 17:59    [7711694]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить