Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
kabee Member Откуда: Сообщений: 22 |
Добрый день. Имеется следующий код: SqlTransaction sqlTransaction = connection.BeginTransaction(); try { for(...) { object x = xCommand.ExecuteScalar(); if (...) { command1.ExecuteNonQuery(); } else { command2.ExecuteNonQuery(); } } sqlTransaction.Commit(); sqlTransaction = connection.BeginTransaction(); } catch() { sqlTransaction.Rollback(); } В транзакцию (ms sql 10.50) должны добавлятся команды на основе выбора объекта x. xCommand использует свой connection2. Данная схема не работает уже на второй итерации, т.к. ExecuteScalar повисает после незакоммиченной транзакции с командой 1 или 2 (не суть) вопрос: как правильно реализовать это логику? |
2 апр 13, 12:00 [14125605] Ответить | Цитировать Сообщить модератору |
Гость333 Member Откуда: Сообщений: 3683 |
Какую логику? Вы пытаетесь сделать автономную транзакцию для xCommand? Или там происходит подключение от имени другого пользователя? "ExecuteScalar повисает после незакоммиченной транзакции" — блокировки на базе смотрели? |
||
2 апр 13, 14:21 [14126625] Ответить | Цитировать Сообщить модератору |
kabee Member Откуда: Сообщений: 22 |
я делал автономный запрос в xCommand используя такое же подключение что и connection. при этом xCommand не выполнялась т.к. таблица была заблокирована. помогло добавление with (nolock) проблема оказалась в следующем: command1 содержала disable trigger all on tableбез нее все работает |
2 апр 13, 15:13 [14126892] Ответить | Цитировать Сообщить модератору |
Maxx Member [скрыт] Откуда: Сообщений: 24290 |
с клиентского приложения ? Ето у вас юмор такой ? |
||
2 апр 13, 15:15 [14126901] Ответить | Цитировать Сообщить модератору |
kabee Member Откуда: Сообщений: 22 |
Maxx, я не разобрался пока с проблемой, но исключение отключения триггеров в инсерте (command1) сняло блокировку с таблицы |
2 апр 13, 15:20 [14126938] Ответить | Цитировать Сообщить модератору |
Гость333 Member Откуда: Сообщений: 3683 |
Это чудовищно
Семижды чудовищно |
||||
2 апр 13, 15:38 [14127045] Ответить | Цитировать Сообщить модератору |
ambarka_max Member Откуда: Россия Сообщений: 517 |
Советую подумать над тем, что код object x = xCommand.ExecuteScalar(); if (...) { command1.ExecuteNonQuery(); } else { command2.ExecuteNonQuery(); } по возможности вставить внутрь одной хранимой процедуры, туда же перенести открытие и откат транзакций. В итоге код на клиенте должен получиться вообще без головняка try { command1.ExecuteNonQuery(); } catch() { Сообщить об ошибке } |
2 апр 13, 15:54 [14127157] Ответить | Цитировать Сообщить модератору |
ambarka_max Member Откуда: Россия Сообщений: 517 |
Кстати,
|
|
2 апр 13, 15:58 [14127185] Ответить | Цитировать Сообщить модератору |
Гость333 Member Откуда: Сообщений: 3683 |
Дык, как я понял, вся "фишка" — в автономной транзакции, в которой выполняется xCommand. MSSQL, к сожалению, не поддерживает такой функционал "из коробки". |
||
2 апр 13, 16:01 [14127209] Ответить | Цитировать Сообщить модератору |
Гость333 Member Откуда: Сообщений: 3683 |
Хотя, судя по ответам автора, меня берут большие сомнения по поводу того, чего именно он хотел, надо ли это реализовывать именно так, а не сделать ли из всего этого, действительно, одну хранимку и т.д. и т.п. |
||||
2 апр 13, 16:04 [14127231] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |