Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE / 25 сообщений из 78, страница 1 из 4
05.07.2016, 16:12
    #39268114
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
Мне иногда не хватает пары функций типа 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
05.07.2016, 16:20
    #39268126
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
rdb_dev,

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

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

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

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

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

Вообще говоря, если выкинуть "транзакционность",
то лок/анлок как DDL операция (типа set inactive)
могла бы быть полезной. Другое дело, что часто
подобное не должно надобиться - попахивает.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.07.2016, 17:40
    #39268183
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
Dimitry SibiryakovА теперь хотя бы один вменяемый пример назачем это нужно - В СТУДИЮ!!!Чем тебе не пример сброс последовательности в триггере при удалении всех записей таблицы или процедура shrinkMyTableId для ужимания идентификаторов "на ходу" без необходимости монопольного (соло) доступа к базе?
...
Рейтинг: 0 / 0
05.07.2016, 17:48
    #39268194
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
Симонов ДенисОднако у 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
05.07.2016, 17:54
    #39268202
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
rdb_devЧем тебе не пример сброс последовательности в триггере при удалении всех записей таблицы

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

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

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

(С) - певец слов ртом.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.07.2016, 18:18
    #39268226
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
Dimitry SibiryakovПоле в базе расширить проще чем геморроиться сбросом генераторов.Очень может быть, но перфекционизм что-то никак не отпускает.
...
Рейтинг: 0 / 0
05.07.2016, 18:21
    #39268228
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
Прибивать блокировки к генераторам - конечно перебор (или слишком частная задача, пахнущая, гм, не очень),
но вот сделать что-то типа такого - совсем не помешает, как по мне
...
Рейтинг: 0 / 0
05.07.2016, 18:26
    #39268234
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
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
05.07.2016, 18:35
    #39268236
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
hvlad> но вот сделать что-то типа такого - совсем не помешает, как по мне

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

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


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