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

Откуда: Россошь-Москва
Сообщений: 494
Всем привет!

Need help.
Из приложения в событии "Старт" вызываем выполнение процедуры на сервере:
SQL("EXECUTE dbo.LUDINGAddAccTask "&PerfID&", "&IDTask)
запрос процедуры следующий:
Insert into SBTaskAcc (TaskID, AccountID, XRecID, SessionKey, SessionKeyPluginName) 
        select "& IDTask &", "& PerfID& ", tt1.XRecID, NULL, NULL from 
                         (select top 1 XRecID+1 as XRecID from SBTaskAcc order by XRecID Desc) as tt1

Особенность приложения оказалась очень интересной:
во время выполнения события "Старт", приложение записывает в эту же таблицу свою строку, а тут получается и я со своим запросом (вставкой). Вобщем происходит попытка вставить второй уникальный IDшник таблицы и выдается ошибка:
State: 01000, SQL Error Code: 3621?The statement has been terminated.?SQL State: 23000, SQL Error Code: 2627?Violation of PRIMARY KEY constraint 'SBTaskAcc_PK'. Cannot insert duplicate key in object 'dbo.SBTaskAcc'. The duplicate key value is (304240). 


Идея выхода из ситуации: отсрочить выполнение запроса, например на 2 секунды, но при этом не завалить сервер ввиду 400 (пока MAX) выполнений такой процедуры в час.

Подскажите, как решить сию задачу? как выкрутиться?

P.S. Да, кстати, напряму из базы insert проходит без проблем.
__________________________________________________________
Я знаю, что ничего не знаю.
Сократ.
21 дек 11, 18:26    [11805387]     Ответить | Цитировать Сообщить модератору
 Re: Отложить выполнение запроса (Insert)  [new]
libru
Member

Откуда:
Сообщений: 877
waitfor ?
21 дек 11, 18:29    [11805401]     Ответить | Цитировать Сообщить модератору
 Re: Отложить выполнение запроса (Insert)  [new]
Geep
Member

Откуда: Москва
Сообщений: 975
Отсрочить - это костыль. Логика кривая.
21 дек 11, 18:38    [11805432]     Ответить | Цитировать Сообщить модератору
 Re: Отложить выполнение запроса (Insert)  [new]
Jovanny
Member

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

Insert into SBTaskAcc (TaskID, AccountID, XRecID, SessionKey, SessionKeyPluginName)  WITH(TABLOCK)
        select "& IDTask &", "& PerfID& ", tt1.XRecID, NULL, NULL from 
                         (select top 1 XRecID+1 as XRecID from SBTaskAcc order by XRecID Desc) as tt1


Вторая сессия будет ожидать, пока первая не завершит транзакцию.
21 дек 11, 20:53    [11805850]     Ответить | Цитировать Сообщить модератору
 Re: Отложить выполнение запроса (Insert)  [new]
Geep
Member

Откуда: Москва
Сообщений: 975
Jovanny, не там
Сесии получают один и тот же айдишник.
21 дек 11, 21:12    [11805903]     Ответить | Цитировать Сообщить модератору
 Re: Отложить выполнение запроса (Insert)  [new]
farbox
Member

Откуда: Россошь-Москва
Сообщений: 494
libru
waitfor ?


libru, почитал про waitfor, не могу понять как в моём случае его использовать... не подскажите примерно?

Geep
Отсрочить - это костыль. Логика кривая.


Geep, я понимаю что логика кривая, но приложения писали не мы, и оно действительно кривое по логике и возможностям. Приложение изменить нет возможности.
Есть возможность только как-то хитро-..опо выкрутиться через скуль запросы. Вот и пытаюсь извернуться.

Может есть другое более логичное решение, не известное мне?
Поделитель опытом / знанием кто может, плз.

__________________________________________________________
Я знаю, что ничего не знаю.
Сократ.
22 дек 11, 10:23    [11807177]     Ответить | Цитировать Сообщить модератору
 Re: Отложить выполнение запроса (Insert)  [new]
baracs
Member

Откуда: Москва
Сообщений: 7217
farbox
Особенность приложения оказалась очень интересной:
во время выполнения события "Старт", приложение записывает в эту же таблицу свою строку, а тут получается и я со своим запросом (вставкой). Вобщем происходит попытка вставить второй уникальный IDшник таблицы...
А зачем вы тут своим запросом вставляете тот же самый IDшник?
22 дек 11, 10:44    [11807332]     Ответить | Цитировать Сообщить модератору
 Re: Отложить выполнение запроса (Insert)  [new]
farbox
Member

Откуда: Россошь-Москва
Сообщений: 494
baracs
farbox
Особенность приложения оказалась очень интересной:
во время выполнения события "Старт", приложение записывает в эту же таблицу свою строку, а тут получается и я со своим запросом (вставкой). Вобщем происходит попытка вставить второй уникальный IDшник таблицы...
А зачем вы тут своим запросом вставляете тот же самый IDшник?


В том то и дело, что я хочу вставить не тот же самый айдишник, а получается один и тот же.
Т.е. приложение во время выполнения стобытия "Старт" добавляется стоку (с ID соответственно) в указанную таблицу, но в этом же событии и мы хотим через SQL запрос вставить свою строку. К сожалению, других событий, удовлетворяющих нашим требованиям в приложении нет.
Повторюсь по поводу приложения ... , имеем то что имеем, к сожалению... :-(
22 дек 11, 11:00    [11807421]     Ответить | Цитировать Сообщить модератору
 Re: Отложить выполнение запроса (Insert)  [new]
Glory
Member

Откуда:
Сообщений: 104751
farbox
В том то и дело, что я хочу вставить не тот же самый айдишник, а получается один и тот же.

Ну так работайте над тем, чтобы ID получился другой
22 дек 11, 11:03    [11807445]     Ответить | Цитировать Сообщить модератору
 Re: Отложить выполнение запроса (Insert)  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Что-то не совсем понятна логика вопроса.
Есть приложение, которое вставляет подряд две строки с одним и тем же ID, чем нарушает требования первичного ключа.
Приложение Вы менять не можете. Вопрос - как оно работало до этого?
22 дек 11, 11:10    [11807494]     Ответить | Цитировать Сообщить модератору
 Re: Отложить выполнение запроса (Insert)  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Jovanny
Что-то не совсем понятна логика вопроса.
Есть приложение, которое вставляет подряд две строки с одним и тем же ID, чем нарушает требования первичного ключа.
Приложение Вы менять не можете. Вопрос - как оно работало до этого?
Первая запись же вставится.
А вторую, небось, со второй попытки вставляют.
Зато эксклюзивных блокировок таблицы, наверно, нет.
Такая стратегия тоже возможна, хоть и некрасива она...
22 дек 11, 11:13    [11807527]     Ответить | Цитировать Сообщить модератору
 Re: Отложить выполнение запроса (Insert)  [new]
farbox
Member

Откуда: Россошь-Москва
Сообщений: 494
Glory
farbox
В том то и дело, что я хочу вставить не тот же самый айдишник, а получается один и тот же.

Ну так работайте над тем, чтобы ID получился другой


очень спасибо, над этим и работаем.

XRecID+[b]2[/b]
не спасает, при таком подходе возникает ошибка при выполнении события "Старт" уже другого объекта в приложении. Единственное, от чего можем отталкиваться (что выявили), это то, что при выполнении INSERT непосредственно из Скуля все проходит гладко.
22 дек 11, 11:14    [11807542]     Ответить | Цитировать Сообщить модератору
 Re: Отложить выполнение запроса (Insert)  [new]
farbox
Member

Откуда: Россошь-Москва
Сообщений: 494
iap
А вторую, небось, со второй попытки вставляют.

Так оно и есть, только из-за вываливающейся ошибки при первой вставке, приходится принудительно продолжать выполнение объекта (есть функция - возобновления), но вывалившаяся ошибка обязательно попадает в текст результата выполнения объекта, и в силу приложения, исключить её не представляется возможным.
22 дек 11, 11:21    [11807593]     Ответить | Цитировать Сообщить модератору
 Re: Отложить выполнение запроса (Insert)  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
А в процедуре TRY...CATCH использовать?
22 дек 11, 11:23    [11807603]     Ответить | Цитировать Сообщить модератору
 Re: Отложить выполнение запроса (Insert)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
farbox
Единственное, от чего можем отталкиваться (что выявили), это то, что при выполнении INSERT непосредственно из Скуля все проходит гладко.
Странные вы вещи говорите...

Невозможно выполнить INSERT не непосредственно из Скуля , других способов не существует.
farbox
Geep, я понимаю что логика кривая, но приложения писали не мы, и оно действительно кривое по логике и возможностям. Приложение изменить нет возможности.
Нужно искать возможность менять приложение.
farbox
запрос процедуры следующий:
Insert into SBTaskAcc (TaskID, AccountID, XRecID, SessionKey, SessionKeyPluginName) 
        select "& IDTask &", "& PerfID& ", tt1.XRecID, NULL, NULL from 
                         (select top 1 XRecID+1 as XRecID from SBTaskAcc order by XRecID Desc) as tt1
Это что, в процедуре на T-SQL прямо так и написано: select "& IDTask

Что то мне не верится.
22 дек 11, 11:24    [11807610]     Ответить | Цитировать Сообщить модератору
 Re: Отложить выполнение запроса (Insert)  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Типа
BEGIN TRY
Insert into SBTaskAcc (TaskID, AccountID, XRecID, SessionKey, SessionKeyPluginName) 
        select "& IDTask &", "& PerfID& ", tt1.XRecID, NULL, NULL from 
                         (select top 1 XRecID+1 as XRecID from SBTaskAcc order by XRecID Desc) as tt1
END TRY
BEGIN CATCH
-- добавить к ключу 1
Insert into SBTaskAcc (TaskID, AccountID, XRecID, SessionKey, SessionKeyPluginName) 
        select "& IDTask &", "& PerfID& ", tt1.XRecID, NULL, NULL from 
                         (select top 1 XRecID+1 as XRecID from SBTaskAcc order by XRecID Desc) as tt1
END CATCH 
22 дек 11, 11:26    [11807625]     Ответить | Цитировать Сообщить модератору
 Re: Отложить выполнение запроса (Insert)  [new]
Geep
Member

Откуда: Москва
Сообщений: 975
Генерация ID много обсуждалась. Поищите на форуме.
22 дек 11, 11:29    [11807642]     Ответить | Цитировать Сообщить модератору
 Re: Отложить выполнение запроса (Insert)  [new]
farbox
Member

Откуда: Россошь-Москва
Сообщений: 494
Jovanny,
спасибо за идею и код, сейчас попоробую.

alexeyvg
Это что, в процедуре на T-SQL прямо так и написано: select "& IDTask

alexeyvg, это констукция для передачи параметров в скуль запрос на языке приложения. Пардон, что не скопировал запрос из процедуры, там естественно такого синтаксиса нет, но суть таже.

Geep
Генерация ID много обсуждалась. Поищите на форуме.

Geep,
т.е. вы думаете, что я не правильно генерирую ID? сейчас поищу на форуме.
Если у Вас есть под рукой ссылка на тему (-ы) - будте любезны - был бы Вам признателен.
22 дек 11, 13:58    [11809162]     Ответить | Цитировать Сообщить модератору
 Re: Отложить выполнение запроса (Insert)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
farbox
alexeyvg
Это что, в процедуре на T-SQL прямо так и написано: select "& IDTask

alexeyvg, это констукция для передачи параметров в скуль запрос на языке приложения. Пардон, что не скопировал запрос из процедуры, там естественно такого синтаксиса нет, но суть таже.
Абсурд какой то.

Вы приведите тот код, который вызывает ошибку, объхясните, какую ошибку и что вы хотите получить.

Вообще, ничего непонятно - где выполняется ошибочный код, кто его "хозяин"? Приложение, которое нельзя менять? Процедура, которую тоже нельзя менять?


farbox
Geep,
т.е. вы думаете, что я не правильно генерирую ID?
Ещё абсурднее.

Вы создаёте тему о том, что у вас проблема из за неправильной генерации ID, а потом такое пишите.


farbox
сейчас поищу на форуме.
Если у Вас есть под рукой ссылка на тему (-ы) - будте любезны - был бы Вам признателен.
Вы для начала опишите проблему.

Все обсуждения на этом форуме касались кода для правильной генерации ID, но там всё-таки предполагается, что можно написать правильный код, что он не зашит в приложение, которое нельзя менять. То есть информации о том, как "отложить insert на 2 секунды" там нет :-)
22 дек 11, 14:17    [11809324]     Ответить | Цитировать Сообщить модератору
 Re: Отложить выполнение запроса (Insert)  [new]
Geep
Member

Откуда: Москва
Сообщений: 975
farbox, попробуйте так:
Insert into SBTaskAcc (TaskID, AccountID, XRecID, SessionKey, SessionKeyPluginName) 
        select "& IDTask &", "& PerfID& ", tt1.XRecID, NULL, NULL from 
                         (select top 1 XRecID+1 as XRecID from SBTaskAcc WITH(TABLOCKX,HOLDLOCK) order by XRecID Desc) as tt1

против лома как говорится нет приёма...
22 дек 11, 16:06    [11810245]     Ответить | Цитировать Сообщить модератору
 Re: Отложить выполнение запроса (Insert)  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
farbox
Jovanny,
спасибо за идею и код, сейчас попоробую.

alexeyvg
Это что, в процедуре на T-SQL прямо так и написано: select "& IDTask

alexeyvg, это констукция для передачи параметров в скуль запрос на языке приложения. Пардон, что не скопировал запрос из процедуры, там естественно такого синтаксиса нет, но суть таже.

Geep
Генерация ID много обсуждалась. Поищите на форуме.

Geep,
т.е. вы думаете, что я не правильно генерирую ID? сейчас поищу на форуме.
Если у Вас есть под рукой ссылка на тему (-ы) - будте любезны - был бы Вам признателен.
Сначала надо отделить мух от котлет.
ID прекрасно генерируется с помощью IDENTITY - этот вопрос закрыт.
Ваша проблема - генерация номера документа, насколько я понимаю.
http://www.gotdotnet.ru/blogs/DeColores/1933/
22 дек 11, 16:23    [11810400]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить