powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Безуспешные попытки update записей, залоченных другой трн, увеличивают marks.Why ?
3 сообщений из 3, страница 1 из 1
Безуспешные попытки update записей, залоченных другой трн, увеличивают marks.Why ?
    #38605835
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hi all

LI-T3.0.0.30813, режиме SuperClassic .

DDL:
Код: plaintext
1.
2.
recreate table t(id int primary key, b blob); commit;
insert into t select row_number()over(), null from rdb$types rows 20; commit;

Тестовый EB (файл "lock_1st_free.sql"), пытающийся "тихо" залочить первую свободную строку с ID >= 10. Если не получится (все заняты), вернёт id_locked = -1, иначе - ID'шник найденной "свободной" записи:
Код: plaintext
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.
rollback;
set transaction no wait;
set term ^;

execute block returns(current_trn int, id_locked int) as
  declare s varchar(255);
  declare b blob;
  declare vkey char(8);
begin
  id_locked = -1;
  current_trn = current_transaction;
  s = 'select rdb$db_key from t  where id>=10  order by id';
  b=rpad('', 32760, gen_uuid() );
  -- наращиваем блоб, чтобы было видно, что вытворяется со счетчиком 'marks':
  b=b||b||b||b||b||b||b||b||b||b||b||b||b||b||b||b||b||b||b;

  for execute statement (s) into vkey
  do begin
    update t set id=id, b = :b
    where rdb$db_key = :vkey returning id into id_locked;
    -- если update успешен, то выдаем результат и немедленно выходим:
    suspend;
    leave;
    when any do begin end
  end
  if (id_locked = -1) then suspend;
end
^ set term ^;
Тест (в двух окнах):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 Session #1 :
SQL> in lock_1st_free.sql;

 CURRENT_TRN    ID_LOCKED
============ ============
          26           10

(залочили успешно первую же запись, т.к. конкурентов нет)

SQL> rollback;

Trace:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
PLAN (T INDEX ())
1 records fetched
     14 ms, 6 read(s),  4696 fetch(es) ,  3116 mark(s) 

Table                             Natural     Index    Update 
**************************************************************
RDB$INDICES                                       2
RDB$RELATION_CONSTRAINTS                          1
T                                                 1         1

Таким обр., по факту был апдейт ID и блоба в одной строке, на это потрачено 3116 "марок".
Кроме того, к кешу СУБД было 4696 обращений (чего так много, кстати ? это конструирование временного блоба так потребовало ?).

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 Session #2 
SQL> update t set id = id; -- т.е. лочим все записи

 Session #1 
SQL> in lock_1st_free.sql;

 CURRENT_TRN    ID_LOCKED
============ ============
          28           -1 -- сиё означает, что ничего залочить не сложилось

Trace:
Код: plaintext
1.
2.
3.
4.
5.
6.
PLAN (T INDEX ())
1 records fetched
     36 ms, 2 read(s), 4 write(s),  9479 fetch(es), 6267 mark(s) 

Table                             Natural     Index    Update  
***************************************************************
T                                                11         11 

По факту НЕ было ни одного апдейта, были только жалкие безуспешные попытки оного.
Но в трейсе показывается, что их было якобы 11 штук и при этом в кеш СУБД было записано 6267 марок, а чтений из него случилось 9479 раз.
Эти числа подозрительно похожи на соотв-щие из первого апдейта (успешного), только умноженные на 2.

Соб-сно, вопрос: это так и должно быть в статистике ?
...
Рейтинг: 0 / 0
Безуспешные попытки update записей, залоченных другой трн, увеличивают marks.Why ?
    #38605844
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

что статистика выводит апдейты, которых не было - вроде как мелкий баг, и я даже как-то собирался его поправить, но забил :-)

про марки пока ничего не могу сказать, может это и нормально
...
Рейтинг: 0 / 0
Безуспешные попытки update записей, залоченных другой трн, увеличивают marks.Why ?
    #38605851
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr,

а фетчи откудова такие ?
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Безуспешные попытки update записей, залоченных другой трн, увеличивают marks.Why ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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