Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 ExecuteScalar в транзакции  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: ExecuteScalar в транзакции  [new]
Гость333
Member

Откуда:
Сообщений: 3683
kabee
вопрос: как правильно реализовать это логику?

Какую логику? Вы пытаетесь сделать автономную транзакцию для xCommand? Или там происходит подключение от имени другого пользователя? "ExecuteScalar повисает после незакоммиченной транзакции" — блокировки на базе смотрели?
2 апр 13, 14:21    [14126625]     Ответить | Цитировать Сообщить модератору
 Re: ExecuteScalar в транзакции  [new]
kabee
Member

Откуда:
Сообщений: 22
я делал автономный запрос в xCommand используя такое же подключение что и connection.
при этом xCommand не выполнялась т.к. таблица была заблокирована. помогло добавление
with (nolock)

проблема оказалась в следующем: command1 содержала
disable trigger all on table
без нее все работает
2 апр 13, 15:13    [14126892]     Ответить | Цитировать Сообщить модератору
 Re: ExecuteScalar в транзакции  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
kabee
disable trigger all on table

без нее все работает


с клиентского приложения ? Ето у вас юмор такой ?
2 апр 13, 15:15    [14126901]     Ответить | Цитировать Сообщить модератору
 Re: ExecuteScalar в транзакции  [new]
kabee
Member

Откуда:
Сообщений: 22
Maxx,

я не разобрался пока с проблемой, но исключение отключения триггеров в инсерте (command1) сняло блокировку с таблицы
2 апр 13, 15:20    [14126938]     Ответить | Цитировать Сообщить модератору
 Re: ExecuteScalar в транзакции  [new]
Гость333
Member

Откуда:
Сообщений: 3683
kabee
помогло добавление
with (nolock)

Это чудовищно

kabee
проблема оказалась в следующем: command1 содержала
disable trigger all on table

Семижды чудовищно
2 апр 13, 15:38    [14127045]     Ответить | Цитировать Сообщить модератору
 Re: ExecuteScalar в транзакции  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
Советую подумать над тем, что код
object x = xCommand.ExecuteScalar();
		if (...) {	command1.ExecuteNonQuery(); }
		else { command2.ExecuteNonQuery(); }

по возможности вставить внутрь одной хранимой процедуры, туда же перенести открытие и откат транзакций.
В итоге код на клиенте должен получиться вообще без головняка
try
{
	command1.ExecuteNonQuery();
}
catch()
{
	Сообщить об ошибке
}
2 апр 13, 15:54    [14127157]     Ответить | Цитировать Сообщить модератору
 Re: ExecuteScalar в транзакции  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
Кстати,
+ меня пугает

kabee
Добрый день. Имеется следующий код:

SqlTransaction sqlTransaction = connection.BeginTransaction();
try
{
	for(...)
	{
		object x = xCommand.ExecuteScalar();
		if (...) {	command1.ExecuteNonQuery(); }
		else { command2.ExecuteNonQuery(); }
	}
	sqlTransaction.Commit();
	sqlTransaction = connection.BeginTransaction();
}
catch()
{
	sqlTransaction.Rollback();
}

2 апр 13, 15:58    [14127185]     Ответить | Цитировать Сообщить модератору
 Re: ExecuteScalar в транзакции  [new]
Гость333
Member

Откуда:
Сообщений: 3683
ambarka_max
Советую подумать над тем, что код
object x = xCommand.ExecuteScalar();
		if (...) {	command1.ExecuteNonQuery(); }
		else { command2.ExecuteNonQuery(); }

по возможности вставить внутрь одной хранимой процедуры

Дык, как я понял, вся "фишка" — в автономной транзакции, в которой выполняется xCommand. MSSQL, к сожалению, не поддерживает такой функционал "из коробки".
2 апр 13, 16:01    [14127209]     Ответить | Цитировать Сообщить модератору
 Re: ExecuteScalar в транзакции  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Гость333
ambarka_max
Советую подумать над тем, что код
object x = xCommand.ExecuteScalar();
		if (...) {	command1.ExecuteNonQuery(); }
		else { command2.ExecuteNonQuery(); }

по возможности вставить внутрь одной хранимой процедуры

Дык, как я понял, вся "фишка" — в автономной транзакции, в которой выполняется xCommand. MSSQL, к сожалению, не поддерживает такой функционал "из коробки".

Хотя, судя по ответам автора, меня берут большие сомнения по поводу того, чего именно он хотел, надо ли это реализовывать именно так, а не сделать ли из всего этого, действительно, одну хранимку и т.д. и т.п.
2 апр 13, 16:04    [14127231]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить