powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
78 сообщений из 78, показаны все 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
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268282
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devя имел ввиду монопольный доступ для безопасного изменения значения генератора

Ась? Существует опасное изменение значение генератора в отрыве от таблицы?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268292
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, опасное для генератора?
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268294
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov> Существует опасное изменение значение генератора в отрыве от таблицы?..

Иногда для запросов ещё используют.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268296
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devя имел ввиду монопольный доступ для безопасного изменения
rdb_devопасное для генератора?
У мну телепатер сломался, отсюда не видать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268302
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovУ мну телепатер сломался, отсюда не видать.Какой же ты непонятливый!
Имелась в виду безопасность относительно какой-нибудь транзакции, которой придется "приуныть" по исключению из-за несоответствия выданного генератором значения правилам ограничения ссылочной целостности таблицы.
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268306
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,


Я повторяю свой вопрос - "що ти верзешь?"
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268310
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMaster, "що ти верзеШ?"
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268316
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

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

генераторы как раз и были придуманы для того чтобы не зависеть от транзакции. Вызвал - получил новое уникальное значение, и пофиг сколько пользователей его одновременно дёргает. Твоя же идея полностью нейтрализует его преимущества. И таки не очень понятно что там на счёт прав на такие функции. Существующий USAGE не подходит. У пользователя может права на нормальное использование генератора, вызвав GEN_LOCK в каком-нибудь EXECUTE BLOCK и не вызвав GEN_UNLOCK мы блокируем всех пользователей которые хотят использовать этот генератор.
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268323
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMaster, хухель перекладач допомiг.
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268332
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисТвоя же идея полностью нейтрализует его преимущества.Чем нейтрализует? Какая разница, что будет в качестве значения замены/компаранда для функции InterlockedCompareExchange - (__int64)true или значение какой-нибудь функции типа (__int64)currTranId? Так или иначе, сериализуемость изменений генератора обеспечивается некой атомарной функцией.

Симонов ДенисИ таки не очень понятно что там на счёт прав на такие функции. Существующий USAGE не подходит.Я бы предложил использовать те же права, что и на GEN_ID.

Симонов ДенисУ пользователя может права на нормальное использование генератора, вызвав GEN_LOCK в каком-нибудь EXECUTE BLOCK и не вызвав GEN_UNLOCK мы блокируем всех пользователей которые хотят использовать этот генератор.Пользователь сам и своими руками будет стартовать транзакцию, выполнять внутри GEN_LOCK(), не делать GEN_UNLOCK() и оставлять эту транзакцию активной на неограниченный промежуток времени? Или же это будет делать какой-нибудь "тыжпрограммист"? Если "тыжпрограммист", то он сам дурак.
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268336
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devчто будет в качестве значения замены/компаранда для функции InterlockedCompareExchange

ты видишь разницу между тем когда блокировки и их освобождение происходит внутри, и когда отдано на откуп пользователю?
rdb_devИли же это будет делать какой-нибудь "тыжпрограммист"?

а зачем программист? Обычный пользователь, имеющий права на SEQUENCE под свои логином может выполнить EXECUTE BLOCK. Скажем так, пусть это будет начинающий хакер - вредитель.

И вот ещё вопрос. Что будет если сразу после GEN_LOCK возникнет исключение? Автоматом вызывать GEN_UNLOCK?
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268337
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devИмелась в виду безопасность относительно какой-нибудь транзакции, которой придется
"приуныть" по исключению из-за несоответствия выданного генератором значения правилам
ограничения ссылочной целостности таблицы.

Блокировка генераторов от этого не поможет. Значение, выданное за микросекунду до неё -
ничуть не менее унылое.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268341
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovБлокировка генераторов от этого не поможет. Значение, выданное за микросекунду до неё -
ничуть не менее унылое.Почему не поможет? Если функция GEN_ID() атомарна и блокирует изменение генератора другими вызовами GEN_ID(), то почему атомарность блока операторов в пределах GEN_LOCK()/GEN_UNLOCK() относительно изменения значения генератора не поможет? В чем разница?
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268344
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devВ чем разница?
В транзакциях и их изоляции.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268347
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Дениса зачем программист? Обычный пользователь, имеющий права на SEQUENCE под свои логином может выполнить EXECUTE BLOCK. Скажем так, пусть это будет начинающий хакер - вредитель.С таким же успехом "начинающему хакеру" можно дать права на UPDATE какой-нибудь часто изменяемой таблицы, чтобы он мог сделать SELECT ... FOR UPDATE WITH LOCK. В принципе, для большей безопасности, можно ограничить использование функций GEN_LOCK/GEN_UNLOCK только рамками хранимых процедур и триггеров, созданных SYSDBA или пользователем с ролью RDB$ADMIN.

Симонов ДенисИ вот ещё вопрос. Что будет если сразу после GEN_LOCK возникнет исключение? Автоматом вызывать GEN_UNLOCK?Вызывать автоматом GEN_UNLOCK надо только в случае, если в подтверждаемой или откатываемой транзакции, заблокировавшей генератор по GEN_LOCK, не был выполнен GEN_UNLOCK непосредственно. В иных случаях, ИМХО, решение должен принимать обработчик исключения WHEN ... DO, как указано в примерах топика.
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268349
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovВ транзакциях и их изоляции.Не догоняю... Поясни плз, какое имеет отношение уровень изолированности транзакции к увеличению значения генератора в функции GEN_ID?
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268352
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devНе догоняю...
Какой же ты непонятливый!
Сколько бы ты ни блокировал генератор при его перемотке, это не спасёт таблицу от вставки
записи со значением, нарушающим твою ссылочную целостность.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268365
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev, чтобы не "перегонять из пустого в порожний", утрированно напишу как я себе представляю реализацию этих функций, а вы посмотрите и будете дальше плевать в сторону моих хотелок.

explain
Код: 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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
struct SEQ
{
  volatile __int64 value;
  volatile __int64 lock_owner;
};

__int64 volatile gen_id(const char * seqName, __int64 delta)
{
  SEQ * seq;
  __int64 value,
          oldOwner,
          newOwner = fb::getCurrentTransactionId();
  
  if (NULL == (seq = fb::getSequenceByName(seqName))) throw (int)1;
  while (true)
  {
    oldOwner = ::InterlockedCompareExchange64(&seq->lock_owner, newOwner, 0);
    if (!oldOwner || newOwner == oldOwner) break;
    if (fb::isTransactionTimedOut(newOwner)) throw (int)2;
  }
  value = seq->value;
  if (delta)
  {
    value += delta;
    ::InterlockedExchange64(&seq->value, value);
  }
  if (!oldOwner) ::InterlockedCompareExchange64(&seq->lock_owner, 0, newOwner);
  return value;
}


__int64 volatile gen_lock(const char * seqName)
{
  SEQ * seq;
  __int64 value,
          oldOwner,
          newOwner = fb::getCurrentTransactionId();
  
  if (NULL == (seq = fb::getSequenceByName(seqName))) throw (int)1;
  while (true)
  {
    oldOwner = ::InterlockedCompareExchange64(&seq->lock_owner, newOwner, 0);
    if (!oldOwner || newOwner == oldOwner) break;
    if (fb::isTransactionTimedOut(newOwner)) throw (int)2;
  }
  return seq->value;
}


void volatile gen_unlock(const char * seqName)
{
  SEQ * seq;
  __int64 owner = fb::getCurrentTransactionId();

  if (NULL == (seq = fb::getSequenceByName(seqName))) throw (int)1;
  ::InterlockedCompareExchange64(&seq->lock_owner, 0, owner);
}

...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268367
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В многопользовательском режиме они всё равно будут бесполезны.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268369
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, почему?
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268370
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в gen_lock() забыл прописать барьерную функцию синхронизации кэшей процессоров перед получением seq->value
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268372
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devпочему?
Транзакция 1 получает номер из последовательности.
Транзакция 1 вставляет запись с этим номером.
Транзакция 2 блокирует последовательность, удаляет записи и сбрасывает последовательность..
Транзакция 1 коммитится.
Транзакция 2 сбрасывает лок и коммитится.

Всё, в таблице запись, с номером больше последовательности и бомба тикает.

Ты легко воспроизведёшь это обернув свой псевдокод в UDF.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268383
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, ну да, при таком раскладе Транзакция 2 (read_committed) не увидит новую запись до коммита Транзакции 1, если только Транзакция 1 не освобождает генератор автоматом на commit/rollback, а при некоторых других уровнях изолированности и вовсе её не увидит. Ты прав.
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268395
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, ну хорошо... Тогда такой пример:
База данных, при открытии первого соединения, должна инициализировать глобальные временные таблицы и пользовательские контекстные переменные, а остальные подключения должны ожидать, пока первое подключение не завершит необходимые действия. В триггере на открытие соединения (TRIGGER ON CONNECT) прописываем GEN_LOCK() и используем блокировку некоего генератора для подвешивания остальных подключений до завершения процедуры инициализации и автоматического GEN_UNLOCK() после успешного завершения специальной транзакции на соединение с БД. Что-то типа синтетического мьютекса, который, конечно, можно и через обычную UDF реализовать.

Или такой абстрактный пример:
Некой транзакции, вероятность отката, которой, довольно высока, необходимо получить идентификаторы для вставки большого числа записей в несколько зависимых таблиц (к примеру, на 8 - 10 уровней вложенности 1-ко-многим) и принятие решения о подтверждении или откате может быть принято только после успешной вставки всех необходимых записей, естественно (bulk вставка). В этом случае, транзакция может заблокировать все необходимые генераторы, но не изменять их значения до момента принятия решения о подтверждении.
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268397
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devБаза данных, при открытии первого соединения, должна инициализировать глобальные временные таблицы и пользовательские контекстные переменные, а остальные подключения должны ожидать, пока первое подключение не завершит необходимые действия.

Какой смысл? Данные GTT и контекстные переменные не шарятся между коннектами.
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268400
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисКакой смысл? Данные GTT и контекстные переменные не шарятся между коннектами.Почему-то сейчас очень захотелось выматериться. То ли из-за того, что забыл/упустил из виду этот момент, то ли из-за того, что ФБ не имеет глобальных временных таблиц, данные из которых можно использовать в разных соединениях. У меня были виды на эту фичу...
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268402
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

Это можно сделать и сейчас. Например, хранимая ф-ция в 3.0 + udf, в к-рой 2 ф-ции: WaitFor и ReleaseMutex. Ну и между ними твое gen_id.
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268403
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock, пока что не планируется переход на тройку.
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268415
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

Ну, какие проблемы? Селективная процедура - не так удобно и наглядно, но использовать можно для этих же целей при желании. Или просто с returning_values.
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268483
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockudf, в к-рой 2 ф-ции: WaitFor и ReleaseMutex. Ну и между ними твое gen_id.Да, ты прав! Гораздо проще это сделать самому парой маленьких UDF'ок. Можно даже вести собственный регистр именованных lock объектов для атомарных функций, чтобы не увеличивать накладные расходы на мьютексы. Вот только с триггерами commit/rollback заморочек отхвачу.
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268611
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockЭто можно сделать и сейчас. Например, хранимая ф-ция в 3.0 + udf, в к-рой 2 ф-ции: WaitFor и ReleaseMutex.
писали такую фигню и 15 лет назад. Основная проблема - это что делать с заблокированным объектом, если коннект, его заблокировавший, отвалился.
Из той же оперы - пометки в неких таблицах о логине пользователя, и т.д.
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268649
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devтранзакция может заблокировать все необходимые генераторы, но не изменять их значения до
момента принятия решения о подтверждении.

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

Мой ХШ говорит что человек бездырочную нумерацию сделать хочет.
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268661
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Симонов Денис!
You wrote on 6 июля 2016 г. 11:59:12:

Симонов Денис> Мой ХШ говорит что человек бездырочную нумерацию сделать хочет.
аполитично рассуждаешь, клянусь, честное слово! не понимаешь политической ситуации! (с)

ТС намерен изменить мир к лучшему.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268696
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис> Мой ХШ говорит что человек бездырочную нумерацию сделать хочет.

Это и вообще без генератора можно сделать.
Хотя за ТС не поручусь, конечно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268766
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамХотя за ТС не поручусь, конечно.В каком смысле "не поручусь"? В смысле, что ТСу не известны разные варианты решений бездырочной нумерации вообще без генератора? Как минимум, два варианта.
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268789
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev> В смысле, что ТСу не известны разные варианты

В смысле, что ты не возьмешься делать БЕН через лок генератора.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268807
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамВ смысле, что ты не возьмешься делать БЕН через лок генератора.Конкретно БЕН через лок генератора да - теперь уже не возьмусь, Dimitry Sibiryakov меня почти полностью разубедил (если только буду использовать локи генератора через UDF для bulk вставок), но сами объекты блокировок, как таковые, в редких случаях, бывают очень полезны.
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268826
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev> сами объекты блокировок

Нет такого понятия в БД.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39268920
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамНет такого понятия в БД.Конечно нет. Возможно, сварганю в UDF'ках.
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39269116
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисМой ХШ говорит что человек бездырочную нумерацию сделать хочет.
Сделать разные генераторы для разных таблиц - чем плох такой вариант?
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39269119
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvОсновная проблема - это что делать с заблокированным объектом, если коннект, его заблокировавший, отвалился.
Если нет SUSPEND'ов в блоке между wait/release, то отвал клиента не должен к такому приводить, как мне кажется.

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

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

Зачем смешивать сущности?

Нужна транзакционность - используйте записи в таблицах. Можно с блокировками на select with lock/update.

Нужна внетранзакционность - используйте генераторы/sequences.
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39270228
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMasterНу вот такие они, комсомольцы энти. Сначала создают себе трудности, а потом героически их преодолевают.Никаких трудностей, необходимых к преодолению, я себе, пока что, еще не придумал. Лишь обсуждаю варианты преодоления трудностей на случай, если придется. ;)
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39270229
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv, подытожив сообщения из двух веток (спасибо за разъяснения), можно с уверенностью сказать, что реализация функционала объектов блокировки своими силами в UDF, по большому счету, не имеет смысла, а реализация этого функционала внутри сервера Firebird имеет смысл лишь с некоторыми оговорками:

1. установку блокировки объекта необходимо производить в отдельной транзакции и до начала основной транзакции, в которой планируется использовать блокировку;
2. освободить объект блокировки могут только транзакции, выполняющиеся в том же контексте, что и транзакция, заблокировавшая объект;
3. блокировка с объекта не должна сниматься автоматически, если транзакция, установившая блокировку, подтвердилась по CommitRataining и контекст транзакции не изменился;
4. блокировка должна сниматься с объекта автоматически в момент очистки контекста транзакции, установившей блокировку на объект (при обычных Commit/Rollback), или же при откате по RollbackRetaining именно той транзакции, что установила эту блокировку;

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

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

пункт 2 мутный. а так да, Влад прав, похоже на транзакции с блокированием таблиц.

rdb_dev лучше захватывать объекты блокировки таким же
я так понимаю, что у тебя по ТЗ некие объекты блокировки настолько привязаны к транзакциям, что логичнее использовать сами транзакции, которые уже есть, чем какие-то мифические блокировки, которых не будет (скорее всего).
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39270390
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Kdv!
You wrote on 8 июля 2016 г. 11:19:32:

Kdv> я так понимаю, что у тебя по ТЗнет там ТЗ.
есть нефильтруемый поток мутного сознания

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39270394
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящийесть нефильтруемый поток мутного сознанияПоток фильтруемый и не мутного сознания, а не до конца сформулированной идеи.
...
Рейтинг: 0 / 0
Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
    #39270464
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devhvlad, намекаешь на то, что лучше захватывать объекты блокировки таким же способом?Намекаю на то, что нужное тебе уже есть.
...
Рейтинг: 0 / 0
78 сообщений из 78, показаны все 4 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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