powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
25 сообщений из 78, страница 1 из 4
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268114
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне иногда не хватает пары функций типа GEN_LOCK(<имя_последовательности>)/GEN_UNLOCK(<имя_последовательности>), которые блокировали бы изменение последовательности и снимали такую блокировку в рамках транзакции. Конечно, в некоторых случаях, при некорректном использовании этих функций в хранимых процедурах, триггерах и блоках, можно получить жестокие тормоза, но реализация подобных функций в Firebird позволила бы более гибко и без нарушения целостности управлять пространством генерируемых значений.
Несколько примеров, как это могло бы выглядеть:
Код: 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.
SET TERM ^;
CREATE OR ALTER TRIGGER myTable__TR_BI
  FOR myTable
  ACTIVE
  BEFOR INSERT
  POSITION 0
AS
  DECLARE VARIABLE seqValue BIGINT DEFAULT NULL;
BEGIN
  .
  .
  .
  seqValue = GEN_LOCK(mySequence);    -- висим внутри функции, пока не заблокируем
                                      -- или пока наша транзакция не навернется по таймауту
  IF (NEW.Id IS NULL OR NEW.Id > :seqValue) THEN
    NEW.Id = GEN_ID(mySequence, 1);
  GEN_UNLOCK(mySequence);             -- освобождаем последовательность
  seqValue = NULL;
  .
  .
  .
  WHEN ANY DO
    BEGIN
      IF (:seqValue IS NOT NULL) THEN
        GEN_UNLOCK(mySequence);   -- Если 
      EXCEPTION;
    END
END^
SET TERM ;^


или
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
SET TERM ^;
CREATE OR ALTER TRIGGER myTable__TR_AD
  FOR myTable
  ACTIVE
  AFTER DELETE
  POSITION 32767
AS
  DECLARE VARIABLE seqValue BIGINT DEFAULT NULL;
BEGIN
  seqValue = GEN_LOCK(mySequence);    -- висим внутри функции, пока не заблокируем
                                      -- или пока наша транзакция не навернется по таймауту
  IF (NOT EXISTS(SELECT FIRST 1 * FROM myTable)) THEN
    seqValue = GEN_ID(mySequence, seqValue * -1)
  GEN_UNLOCK(mySequence);             -- освобождаем последовательность
  seqValue = NULL;
  WHEN ANY DO
    BEGIN
      IF (:seqValue IS NOT NULL) THEN
        GEN_UNLOCK(mySequence);
      EXCEPTION;
    END
END^
SET TERM ;^


или такая маленькая ХП в помощь SYSDBA
Код: 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.
SET TERM ^;
CREATE OR ALTER PROCEDURE shrinkMyTableId
AS
  DECLARE VARIABLE Id BIGINT DEFAULT NULL;
  DECLARE VARIABLE newId BIGINT DEFAULT 0;
  DECLARE VARIABLE seqValue BIGINT DEFAULT NULL;
BEGIN
  seqValue = GEN_LOCK(mySequence);   -- Блокируем изменение последовательности
  FOR
      SELECT Id, :newId + 1
        FROM myTable
        WHERE Id > 0
        ORDER BY Id ASC
        FOR UPDATE WITH LOCK
        INTO: Id, newId
    DO
      IF (:Id != :newId) THEN
        UPDATE myTable
          SET Id = :newId
          WHERE Id = :Id;
  seqValue = GEN_ID(mySequence, newId - seqValue);
  GEN_UNLOCK(mySequence);
  seqValue = NULL;
  WHEN ANY DO
    BEGIN
      IF (:seqValue IS NOT NULL) THEN
        GEN_UNLOCK(mySequence);
      EXCEPTION;
    END
END^
SET TERM ;^


...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268126
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

бред. Генераторы работают вне контекста транзакций.
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268129
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devМне иногда не хватает пары функций типа GEN_LOCK(<имя_последовательности>) /GEN_UNLOCK(<имя_последовательности>), которые блокировали бы изменение последовательности и снимали такую блокировку в рамках транзакции.вася, ты дурак?
или просто потроллить тут решил?

сиквенсы и транзакции живут в параллельных вселенных.
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268134
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий, спасибо, ваше мнение очень "важно" для нас.
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268136
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисбред. Генераторы работают вне контекста транзакций.
Контекст транзакции для генератора тут не важен. Важно лишь заблокировать изменение генератора до освобождения по GEN_UNLOCK() или до автоматического освобождения по подтверждению или откату транзакции, в которой был генератор был заблокирован по GEN_LOCK().
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268144
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

это противоречит смыслу последовательностей. Посмотрел бы ты лучше в стандарт.

авторseqValue = GEN_ID(mySequence, seqValue * -1)

Вообще сама функция GEN_ID унаследованная и тоже нарушает принцип работы с SEQUENCE, по стандарту NEXT VALUE FOR sequence_name
В этом случае ты не сможешь дёргать генератор на значение отличное от значения INCREMENT заданное при создании последовательности. Однако у GEN_ID есть одно очень полезное свойство, а именно: она позволяет дёргать сразу пачку значений чтобы не не обращаться к странице генератора часто, тем самым ускоряя массовый INSERT.
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268148
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devНесколько примеров, как это могло бы выглядеть
А теперь хотя бы один вменяемый пример назачем это нужно - В СТУДИЮ!!!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268159
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий> сиквенсы и транзакции живут в параллельных вселенных.

Вообще говоря, если выкинуть "транзакционность",
то лок/анлок как DDL операция (типа set inactive)
могла бы быть полезной. Другое дело, что часто
подобное не должно надобиться - попахивает.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268183
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovА теперь хотя бы один вменяемый пример назачем это нужно - В СТУДИЮ!!!Чем тебе не пример сброс последовательности в триггере при удалении всех записей таблицы или процедура shrinkMyTableId для ужимания идентификаторов "на ходу" без необходимости монопольного (соло) доступа к базе?
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268194
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисОднако у GEN_ID есть одно очень полезное свойство, а именно: она позволяет дёргать сразу пачку значений чтобы не не обращаться к странице генератора часто, тем самым ускоряя массовый INSERT.
Эту тему GEN_ID() я просек еще с первых дней знакомства с FirebirdSQL. Собственно, реализация функционала GEN_ID() или NEXT VALUE FOR, при изменении значения генератора, в любом случае требуют блокировки, хотя бы на уровне атомарных функций.
Для меня, как человека абсолютно незнакомого с сырцами FirebirdSQL, реализация GEN_ID() представляется чем-то вроде:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
  __INLINE
  DWORD volatile __self_lock_add(volatile DWORD *_dst, DWORD _add)
  {
    register volatile DWORD sum asm ("eax");
    asm volatile
    ("\
      .p2align 3;\n\
      again%=:;\n\
        mov %%eax, %%edx;\n\
        add %%ebx, %%edx;\n\
        lock cmpxchg %%edx, %[dst];\n\
        jne again%=;\n\
        xchg %%edx, %%eax;\n\
      "
      : "=a" (sum), [dst] "=m" (*_dst)
      : "a" (*_dst), "b" (_add)
      : "edx", "cc"
    );
    return sum;
  }
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268202
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devЧем тебе не пример сброс последовательности в триггере при удалении всех записей таблицы

сброс последовательности это DDL со всеми вытекающими. И если сделают TRUNCATE, который может скидывать IDENTITY поля, то это тоже будет DDL. Зачем сбрасывать последовательность кому-либо кроме админа БД я не понимаю. Подумай что будет в этом случае при конкурентном доступе.
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268208
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devЧем тебе не пример сброс последовательности в триггере при удалении всех записей таблицы
или процедура shrinkMyTableId для ужимания идентификаторов "на ходу" без необходимости
монопольного (соло) доступа к базе?

Тем, что они невменяемы.
2^63-1 идентификаторов вполне достаточно чтобы они не кончились и без сброса генераторов
при очищении таблицы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268212
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисПодумай что будет в этом случае при конкурентном доступе.Что еще может случиться при конкурентном доступе к генератору, кроме некоторой задержки на выполнение нескольких операторов между GEN_LOCK() и GEN_UNLOCK() в другой транзакции?
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268216
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovТем, что они невменяемы.
2^63-1 идентификаторов вполне достаточно чтобы они не кончились и без сброса генераторов
при очищении таблицы.Этих идентификаторов вполне достаточно, если поле таблицы с IDENTITY также BIGINT, но базы бывают разные и под разные "сценарии".
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268218
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devбазы бывают разные
Поле в базе расширить проще чем геморроиться сбросом генераторов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268223
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Dimitry Sibiryakov!
You wrote on 5 июля 2016 г. 18:13:35:

Dimitry Sibiryakov> Поле в базе расширить проще чем геморроиться сбросом генераторов.
"не стоит прогибацца под изменчивый мир,
пусть лучче он прогнёцца под нас!"

(С) - певец слов ртом.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268226
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovПоле в базе расширить проще чем геморроиться сбросом генераторов.Очень может быть, но перфекционизм что-то никак не отпускает.
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268228
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прибивать блокировки к генераторам - конечно перебор (или слишком частная задача, пахнущая, гм, не очень),
но вот сделать что-то типа такого - совсем не помешает, как по мне
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268234
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Hvlad!
You wrote on 5 июля 2016 г. 18:23:36:

Hvlad> но вот сделать что-то типа такого https://msdn.microsoft.com/en-us/library/ms189823.aspx - совсем не помешает, как по мне
не, ну ты сравнил...
у них это скорее аналог мьютекса для страждущих невнятного.
а то что предлагает пациент, это полный песец.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268236
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad> но вот сделать что-то типа такого - совсем не помешает, как по мне

О, это еще более универсальный вариант. +много
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268237
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящийто что предлагает пациент, это полный песец.

Ну, может, он не знает, что транзакция способна заблокировать только одну таблицу и всю
базу в эксклюзив переводить совсем ни к чему?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268253
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящийне, ну ты сравнил...
у них это скорее аналог мьютекса для страждущих невнятного.
а то что предлагает пациент, это полный песец.Да неужель? 8-/
И по каким признакам ты понял, что ТС предлагает нечто, сильно отличающееся от того, что сделала Microsoft? Microsoft предлагает через sp_getapplock блокировать любой именованный (глобальный) ресурс (мьютекс) на компе, где установлен SQL Server, выполняющий этот самый sp_getapplock. При этом, в параметре, типа varchar(32), передается некий уникальный идентификатор владельца блокировки. Чем тебе генератор ФБ не "@Resource", а переменная типа int64 в оперативной памяти ФБ сервера внутри структуры генератора, содержащая идентификатор транзакции - владельца блокировки, не "@LockOwner"? Можно даже не через мьютекс реализовывать, а обычным аналогом майкрософтовского InterlockedCompareExchange.
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268256
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovНу, может, он не знает, что транзакция способна заблокировать только одну таблицу и всю
базу в эксклюзив переводить совсем ни к чему?..Что, прости? Я где-то написал про эксклюзивную блокировку всей базы?
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268274
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devЯ где-то написал про эксклюзивную блокировку всей базы?
Ага: 19372174
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268279
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, я имел ввиду монопольный доступ для безопасного изменения значения генератора, а не для изменения значений в поле PK таблицы. Собственно, что именно имелось в виду, прекрасно видно из примера.
...
Рейтинг: 0 / 0
25 сообщений из 78, страница 1 из 4
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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