![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
KEY VIOLATION при выполнении процедуры. [D6, IB6.x]
Vuk © (2004-01-21 14:38:00)
Давно не ковырялся с Interbase, но тут пришлось...
Результаты странные. Получил KEY VIOLATION при выполнении поцедуры со следующей логикой:
CREATE PROCEDURE SomeProc(
KeyField1 INTEGER,
KeyField2 INTEGER,
value INTEGER)
AS
begin
if (exists(select 1 from SomeTable where (KeyField1 =:KeyField1) and (KeyField2 = :KeyField2))) then
update
SomeTable
set
Value = :Value
where
(KeyField1 = :KeyField1) and
(KeyField2 = :KeyField2);
else
insert into SomeTable (
KeyField1,
KeyField2,
Value
)
values(
:KeyField1,
:KeyField2,
:Value );
end
У кого-нибудь есть мысли, как такое может получиться?
Добавлю, что эта процедура вызывается из другой в рамках достаточно длительной по времени (работа с сервером через интернет) транзакции. PK в SomeTable составной (KeyField1, KeyField2).
Johnmen (2004-01-21 15:19:00) [41]
>Vuk © (21.01.04 15:05)
Я думаю, что эта ошибка вследствие наличия в определенный момент конкурирующих транзакций. Причем конкурирующих за записи в указанной таблице... И это конкурирование приводит к конфликтной ситуации...
Vuk (2004-01-21 15:05:00) [42]
Да, полный текст ошибки:
lock conflict on no wait transaction
violation of PRIMARY or UNIQUE KEY constraint "PK_WGOODSINFO" on table "WGOODSINFO"
Vuk (2004-01-21 15:03:00) [43]
to jack128:
>select 1 from
>??
Какая разница что выбирать? Можно имя поля написать, только зачем? Проверяется-то только наличие записи.
>value - зарезервированиое слово
Я ж написал - это описание логики. Можно было бы и догадаться, что я подставил это слово вместо реального названия.
to Johnmen:
>Ошибка устойчива ? Работает один клиент ?
В том-то и дело, что нет. При следующей такой же (даже по составу данных) транзакции все прошло нормально. Пока повторов ошибки не было. Просто интересно, как вообще такое может получиться.
Клиент на обновление был запущен только один.
Johnmen (2004-01-21 14:49:00) [44]
>Vuk © (21.01.04 14:38)
Ошибка устойчива ? Работает один клиент ?
jack128 (2004-01-21 14:44:00) [45]
> select 1from
??
value - зарезервированиое слово
А полный текст ошибки какой?