powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / RC: select for UPDATE with lock *не* выдаёт "update confl" при изменении записи другой трн
13 сообщений из 38, страница 2 из 2
RC: select for UPDATE with lock *не* выдаёт "update confl" при изменении записи другой трн
    #38589816
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидhvladНе потому ли, что кто-то не понимает уровней изоляции тр-ций и принципов конкурентного программирования ?Что именно я не понимаю в TILВот эта фраза тебя выдаёт:
ТаблоидНо сам стейтмент от session #1 начался *ДО* этого коммита от session #2, так почему он вправе еще и МЕНЯТЬ запись, перетирать её ?это может спросить только тот, кто не понимает, что такое изоляция и как она меняется с уровнем
Таблоидпричём тут "принципы конкурентного программирования" ?Али у тебя нет конкурирующих процессов ?

PS сначала я просто плакалЬ, сейчас начну рыдать
...
Рейтинг: 0 / 0
RC: select for UPDATE with lock *не* выдаёт "update confl" при изменении записи другой трн
    #38589817
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

ну так no_rec_version - нельзя читать старую версию , пока для нее существует не-коммиттед-версия.
...
Рейтинг: 0 / 0
RC: select for UPDATE with lock *не* выдаёт "update confl" при изменении записи другой трн
    #38589818
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvВедь select for update - это update , никаким другим способом "заблокировать" запись в ФБ нельзя.Это НЕ апдейт, а только блокировка для последующего апдейта. Если селект включал в себя не только "id = :some_PK_value", но еще и доп. условие на то поле, что мы собираемся менять, то при изменении коннектом-конкурентом этого поля запись НЕ будет найдена.
Если же селект был просто с "where id = :....", то запись после получения надо заново перечитать, т.к. поле может запросто быть уже с другим значением.
В обоих случаях - лишний код. Мну кажется, что логичнее было бы выбрасывать ошибку при этом, как при апдейте.
...
Рейтинг: 0 / 0
RC: select for UPDATE with lock *не* выдаёт "update confl" при изменении записи другой трн
    #38589821
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladPS сначала я просто плакалЬ, сейчас начну рыдатьЛадно. Я понял, что объяснений не будет.
Пойду рыдать дальше над update t set id=id where id = :my_selected_id :-)
...
Рейтинг: 0 / 0
RC: select for UPDATE with lock *не* выдаёт "update confl" при изменении записи другой трн
    #38589826
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидЯ понял, что объяснений не будет.а) я таки надеюсь на то, что ты сам поймёшь, тем более что вся информация тут уже озвучена - осталось её прочитать
б) я физически не в состоянии объяснять каждый твой "вспых", особенно в моменты обострений
...
Рейтинг: 0 / 0
RC: select for UPDATE with lock *не* выдаёт "update confl" при изменении записи другой трн
    #38589841
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидЭто НЕ апдейт
Это и ЕСТЬ апдейт, только без срабатывания триггеров.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
RC: select for UPDATE with lock *не* выдаёт "update confl" при изменении записи другой трн
    #38589847
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

насколько я понял, Таблоид и хочет, чтобы это был НЕ апдейт, а "блокировка".
...
Рейтинг: 0 / 0
RC: select for UPDATE with lock *не* выдаёт "update confl" при изменении записи другой трн
    #38589904
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvнасколько я понял, Таблоид и хочет, чтобы это был НЕ апдейт, а "блокировка".Не, я хотел, чтобы select for update with lock вываливал ошибку 'update conflict', если после того, как он дождётся нужной записи, окажется, что в ней изменено какое-то поле (из тех, что НЕ присутствуют во where-предикате этого селекта, разумеется; иначе он её вообще не увидит :)).
То есть, чтобы он вёл себя строго так же, как update при rc rec_ver.
Но теперь понимаю, что этого нельзя сделать.

Впрочем, это и к лучшему. Конструкция вида
Код: sql
1.
2.
update doc_list h set h.id = h.id where ... order by rand() rows 1 returning f01, f02, ...  into v01, v02, ...;
if (row_count = 0) then exception ex_no_doc_found_for_handling;

- вполне себе подойдёт.
...
Рейтинг: 0 / 0
RC: select for UPDATE with lock *не* выдаёт "update confl" при изменении записи другой трн
    #38590084
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоидkdvнасколько я понял, Таблоид и хочет, чтобы это был НЕ апдейт, а "блокировка".Не, я хотел, чтобы select for update with lock вываливал ошибку 'update conflict', если после того, как он дождётся нужной записи, окажется, что в ней изменено какое-то поле (из тех, что НЕ присутствуют во where-предикате этого селекта, разумеется; иначе он её вообще не увидит :)).
То есть, чтобы он вёл себя строго так же, как update при rc rec_ver.
Но теперь понимаю, что этого нельзя сделать.

Впрочем, это и к лучшему. Конструкция вида
Код: sql
1.
2.
update doc_list h set h.id = h.id where ... order by rand() rows 1 returning f01, f02, ...  into v01, v02, ...;
if (row_count = 0) then exception ex_no_doc_found_for_handling;

- вполне себе подойдёт.
Долго медитировал над этим :)
Имхо нужна функция, которая бы возвращала номер транзакции для записи (в режиме грязного чтения, т.к. для закоммиченых данных у записи уже есть поле rdb$record_version).
Вот пример:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
for 
  select id, rdb$record_version, ... 
  from doc_list 
  where ... and 
  (get_record_transaction(rdb$db_key) = rdb$record_version)  // пропускаем залоченое другими транзакциями
  rows 300
  into :id, :recver
do
begin
  update doc_list set id = id where (id = :id) and
    (rdb$record_version = :recver) and                                     // не было закомиченных изменений
    (get_record_transaction(rdb$db_key) = rdb$record_version);    // запись не залочена другой транзакцией
  if (row_count = 1)   // успешный лок
  begin
    ...
    update doc_list set ... where (id = :id);
  end;
end;



И небольшое отвлечение:

Ещё можно было бы простым запросом типа
Код: sql
1.
select Id, ... from T where rdb$record_version <> get_record_transaction(rdb$db_key)

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

И уже сейчас в тройке можно видеть кто последний менял запись, если вести логи коннектов и транзакций (на db-триггерах) :)
Плохо только что после B/R это ломается...
Может всё-таки возможно при B/R не обнулять счётчик транзакций и счётчик коннектов? И чтобы поле rdb$record_version переживало B/R?

Просто мысли :)
...
Рейтинг: 0 / 0
RC: select for UPDATE with lock *не* выдаёт "update confl" при изменении записи другой трн
    #38590089
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид> Впрочем, это и к лучшему. Конструкция вида
Таблоид> update doc_list h set h.id = h.id where ... order by rand()
Таблоид> - вполне себе подойдёт.

Ты всерьёз собираешься писать такое в продакшен?

P.S. Ещё начав читать предыдущий пост, я понял, что кончится
"таблицами мониторинга". Но вот что он дойдёт до счётчиков
транзакций и счётчиков коннектов с бэкап-ресторами - это даже
предположить было сложно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
RC: select for UPDATE with lock *не* выдаёт "update confl" при изменении записи другой трн
    #38590428
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамТаблоид> Впрочем, это и к лучшему. Конструкция вида
Таблоид> update doc_list h set h.id = h.id where ... order by rand()
Таблоид> - вполне себе подойдёт.

Ты всерьёз собираешься писать такое в продакшен?Не, ты чё! :-)
Это же только для теста, да там после первичных проверок будет по-другому.
...
Рейтинг: 0 / 0
RC: select for UPDATE with lock *не* выдаёт "update confl" при изменении записи другой трн
    #38590431
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамНо вот что он дойдёт до счётчиков
транзакций и счётчиков коннектов с бэкап-ресторами - это даже
предположить было сложно.
Это ты пытаешься упрекнуть в чём? :)
...
Рейтинг: 0 / 0
RC: select for UPDATE with lock *не* выдаёт "update confl" при изменении записи другой трн
    #38591815
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидНе, я хотел, чтобы select for update with lock вываливал ошибку 'update conflict', если после того, как он дождётся нужной записи, окажется, что в ней изменено какое-то поле (из тех, что НЕ присутствуют во where-предикате этого селекта, разумеется; иначе он её вообще не увидит :)).Вот тут ты снова заблуждаешься.
Предикаты проверяются после того , как запись прочитана (было бы странно, если бы это было не так).
"Блокировка" накладывается до того , как запись прочитана.
Поэтому никак и никогда не может быть "что в ней изменено какое-то поле" - поля читаются у уже "заблокированной" записи.
...
Рейтинг: 0 / 0
13 сообщений из 38, страница 2 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / RC: select for UPDATE with lock *не* выдаёт "update confl" при изменении записи другой трн
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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