powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Хотелка: update SKIP LOCKED my_table set ... where id >= :some_selected_id order by id
10 сообщений из 10, страница 1 из 1
Хотелка: update SKIP LOCKED my_table set ... where id >= :some_selected_id order by id
    #38605889
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 dimitr: нет ли в трекере сабжа ?

А то сейчас приходится вот это фигачить:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
create or alter procedure lock_first_free (
    a_updatable_view varchar(31),
    a_start_id dm_ids, -- bigint not null
    a_raise_exc dm_sign default 1 -- smallint default 0 not null check (value in(-1, 1, 0))
)
returns (
    locked_id bigint)
AS
declare s varchar(128);
  declare u varchar(128);
  declare v_key dm_dbkey; -- char(8) character set octets  collate octets
  declare v_cnt int = 0;
begin
  -- tries to LOCK record in A_UPDATABLE_VIEW with first ID >= a_start_id;
  -- returns "normal" number = ID if record has been SUCCESSFULLY locked,
  -- otherwise raise ex_can_not_lock_any_record (if a_raise_exc = 1)
  -- or returns "huge negative" number = -fn_infinity()
  -- Samples:
  -- select * from lock_first_free('t', 10); ==> returns first locked ID or exception
  -- select * from lock_first_free('t', 10, 0); ==> returns first locked ID or -fn_infinity()
  locked_id = -fn_infinity();
  s = 'select rdb$db_key from '||:a_updatable_view||' where id>=:a_id order by id';
  u='update '||:a_updatable_view||' set id = id where rdb$db_key = :a_key returning id';
  for execute statement (s) ( a_id := a_start_id ) into v_key
  do begin
    v_cnt = v_cnt+1;
    execute statement(u) ( a_key := v_key ) into locked_id;
    suspend;
    leave;
    when any do begin end
  end
  if (v_cnt = 0) then
    exception ex_record_not_found;
  else if (locked_id = -fn_infinity()) then
  begin
    if ( a_raise_exc = 1) then
      exception ex_can_not_lock_any_record using( upper(:a_updatable_view), :a_start_id);
     --ex_can_not_lock_any_record 'no records could be locked in table @1 with ID >= @2.';
    else
      suspend;
  end
end
...
Рейтинг: 0 / 0
Хотелка: update SKIP LOCKED my_table set ... where id >= :some_selected_id order by id
    #38605968
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

нет, насколько я помню. А в чем проблема выполнять апдейт в nowait транзакции в цикле и проглатывать конфликты через when?
...
Рейтинг: 0 / 0
Хотелка: update SKIP LOCKED my_table set ... where id >= :some_selected_id order by id
    #38605992
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrв чем проблема выполнять апдейт в nowait транзакции в цикле и проглатывать конфликты через when?да нет проблемы, конечно; но этот велосипед придется опять изобретать / копипастить, когда "вдруг" еще где-то похожая задача возникнет. К тому же, скорость PSQL-кода никогда не будет выше скорости фичи, встроенной в код СУБД.
...
Рейтинг: 0 / 0
Хотелка: update SKIP LOCKED my_table set ... where id >= :some_selected_id order by id
    #38605995
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пиши трекеру, он стерпит. Только мне кажется, что для update/delete это неправильное расширение. Это скорее должно быть дополнительной кляузой у SELECT WITH LOCK.
...
Рейтинг: 0 / 0
Хотелка: update SKIP LOCKED my_table set ... where id >= :some_selected_id order by id
    #38605999
NikolayV81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrпиши трекеру, он стерпит. Только мне кажется, что для update/delete это неправильное расширение. Это скорее должно быть дополнительной кляузой у SELECT WITH LOCK.

Я так понял что хочется по типу mysql update ignore, insert ignore, но эти все нашлёпки сверху приводят к тому что потом невозможно быстро переносить проекты, либо делать поддержку нескольких баз данных.
...
Рейтинг: 0 / 0
Хотелка: update SKIP LOCKED my_table set ... where id >= :some_selected_id order by id
    #38606007
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrпиши трекеру, он стерпит. Только мне кажется, что для update/delete это неправильное расширение. Это скорее должно быть дополнительной кляузой у SELECT WITH LOCK. Добавил.
...
Рейтинг: 0 / 0
Хотелка: update SKIP LOCKED my_table set ... where id >= :some_selected_id order by id
    #38606008
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NikolayV81эти все нашлёпки сверху приводят к тому что потом невозможно быстро переносить проекты, либо делать поддержку нескольких баз данных.Кто пишет универсально-вселенские проекты на 100 разных баз, то пусть ограничивается стандартным SQL, без примочек. И заодно готовится к тому, что всё равно придется где-то что-то рихтовать под каждую базу в отдельности.
...
Рейтинг: 0 / 0
Хотелка: update SKIP LOCKED my_table set ... where id >= :some_selected_id order by id
    #38606087
NikolayV81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидNikolayV81эти все нашлёпки сверху приводят к тому что потом невозможно быстро переносить проекты, либо делать поддержку нескольких баз данных.Кто пишет универсально-вселенские проекты на 100 разных баз, то пусть ограничивается стандартным SQL, без примочек. И заодно готовится к тому, что всё равно придется где-то что-то рихтовать под каждую базу в отдельности.


:) ну так всем дописывателям это не объяснишь
по тикету в таком случае если уж совсем до всех хотелок идти, ввсести служебное поле "получилось залочить", что бы можно было следать что-то типа:
Код: sql
1.
2.
3.
4.
5.
6.
7.
for select id, "получилось залочить" from table inot :id, :locked for update with lock
do 
begin
  if (:locked )
  then update ...
  else insert into faillog ...
end
...
Рейтинг: 0 / 0
Хотелка: update SKIP LOCKED my_table set ... where id >= :some_selected_id order by id
    #38606111
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NikolayV81
Код: sql
1.
2.
3.
4.
5.
6.
7.
for select id, "получилось залочить" from table inot :id, :locked for update with lock
do 
begin
  if (:locked )
  then update ...
  else insert into faillog ...
end


Да, хочется обрабатывать именно таким простым способом. Плюс писать в faillog какая транзакция держит запись, для разбора полётов :)
...
Рейтинг: 0 / 0
Хотелка: update SKIP LOCKED my_table set ... where id >= :some_selected_id order by id
    #38606275
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr> Это скорее должно быть дополнительной кляузой у SELECT WITH LOCK.

Почему не опцией (дополнительной или третьей) для RC?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Хотелка: update SKIP LOCKED my_table set ... where id >= :some_selected_id order by id
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]