powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Транзакционные генераторы
22 сообщений из 47, страница 2 из 2
Транзакционные генераторы
    #38852663
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrMAX(генератор в базе, генератор в кеше)
особенно сильно этому обрадуются те извращенцы, кто юзает GEN_ID с отрицательным инкрементом...
...
Рейтинг: 0 / 0
Транзакционные генераторы
    #38852670
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr2) Незакоммиченный DDL видеть никто не должен.Согласен!

Посему, если уж так, то любое обращение "чужой" тр-ции к незакоммиченному изменённому генератору должно либо ждать коммита (и работать де-факто с закомиченным состоянием), либо выдавать ошибку доступа.
Вот такое вот моё мнение.
...
Рейтинг: 0 / 0
Транзакционные генераторы
    #38852678
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrСильно упертые могут продолжать выкручиваться с нестандартными инкрементами в GEN_ID.Конечно могут. И будут, ибо страница генераторов - одно из узких мест. Если сделать внутри цикла раздачу ИДшников из заранее полученного "пула" (через вызов gen_id( g, :N ), где N >> 1), то будет как в рекламе: "почувствуйте разницу".

dimitr3) В результате впервые в ФБ появляется транзакционный DDL - можно в одной и той же транзакции создать генератор и использовать его, а потом либо грохнуть либо закоммитить.Это всё прекрасно, только как в двух транзакциях создать генератор-"времянку" с одинаковым именем (просто чтобы посчитать им чего-то там, и грохнуть затем) ?
Не получится это. А раз так, то придется делать какой-то изврат типа создания генератора с именем, в которое будет включен номер текущей транзакции. А дальше - выполнять gen_id( имя, 1 ), но ведь его тогда уже и не выполнить в "явном" виде, только через ES.

Гемор какой-то! Поэтому я проголосовал за CORE-4001. Нужен какой-то "локальный счетчик", видимый только в PSQL, никаким боком не отражающийся в метаданных. А еще лучше - структуры такого типа, но это уже фантазии, я понимаю :-)

dimitrЕсли "локальный" (видимый только текущей транзакции), то при коммите при неудачном раскладе мы потеряем только чужие изменения.Что-то непонятно, про какие "чужие" изменения тут речь. Ведь никто не видит мой новосозданный генератор, пока я не ввёл commit.

dimitr5) Явно изменять значения генераторов "на лету" при активной работе с базой - ахтунг. Делать это еще и в длинных транзакциях с GEN_ID внутри - дважды ахтунг. Кто на это нарвется в продакшене - ССЗБ.Нельзя менять в сторону уменьшения. Что плохого в увеличении на шаг N >> 1 для получения "пула" ИДшников - не ведаю. Я этим хаком получил только плюсы, и значительные.
...
Рейтинг: 0 / 0
Транзакционные генераторы
    #38852779
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladосему, если уж так, то любое обращение "чужой" тр-ции к незакоммиченному изменённому генераторуКак по мне так давать отлуп ( no wait), или подождать (wait) и потом или дать отлуп если коммит(роллбак) так и не прошел, если прошел, то отдать валидное значение клиенту и нехай радуется.

ТаблоидНужен какой-то "локальный счетчик", видимый только в PSQLОпять таки мое мнение, это должен быть не генератор, ну или типа GTT генератор.

ТаблоидЧто плохого в увеличении на шаг N >> 1 для получения "пула" ИДшников - не ведаю. Я этим хаком получил только плюсы, и значительные.Этому хаку сто лет в обед, штатно в ФИБах присутствует со времен царя Гороха.
...
Рейтинг: 0 / 0
Транзакционные генераторы
    #38852783
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидНельзя менять в сторону уменьшения. Что плохого в увеличении на шаг N >> 1 для получения "пула" ИДшников - не ведаю. Я этим хаком получил только плюсы, и значительные.

ага. Попробуй вот этот трюк сделать хотя бы 2 раза

Код: sql
1.
2.
3.
SELECT
  GEN_ID(MYGEN, 9223372036854775806) AS n
FROM RDB$DATABASE
...
Рейтинг: 0 / 0
Транзакционные генераторы
    #38853043
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr4) Возникает вопрос - какой счетчик должен увеличивать GEN_ID, выполненный в той же транзакции, что и незакоммиченный SET GENERATOR? Если "глобальный" (закоммиченный, видимый всем), то при коммите он сбросится в значение, установленное через SET GENERATOR - при неудачном раскладе мы потеряем и свои собственные изменения, и изменения других транзакций. Если "локальный" (видимый только текущей транзакции), то при коммите при неудачном раскладе мы потеряем только чужие изменения.

Имхо генераторы - это типовой разделяемый глобальный ресурс с locked exclusive доступом.

то есть на псевдокоде GEN_ID - это

Generator.Lock()
try{
Generator.Inc( OptionalDelta )
return Generator.Current
}finally{ Generator.UnLock() }

Соответственно SET GENERATOR - Это установка еще одного lock завершения транзакции

Generator.Lock()
try{
Generator.Assign( NewValue )

Generator.Lock()
try{
Generator.Inc( OptionalDelta )
return Generator.Current
}finally{ Generator.UnLock() }

Generator.Lock()
try{
Generator.Inc( OptionalDelta )
return Generator.Current
}finally{ Generator.UnLock() }

} catch { Generator.Assign ( Pre-transaction value) }
}finally{ Generator.UnLock() } // commit


Соответсвенно, другие транзакции ВООБЩЕ не должны иметь доступа к генератору до решения его судьбы (снятия лока в результате commit/rollback)

Соответственно внутри транзакции ВОЗМОЖНО не должно быть разрешено чтение ( GEN_ID, SELECT NEXT) после SET GENERATOR (он уже был залочен).
...
Рейтинг: 0 / 0
Транзакционные генераторы
    #38853053
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроме того мне непонятно что делать с генераторами, изменяемыми в середине длинной транзакции

Trans1.Start // Gen=1

Gen_ID // Gen=2
...
Gen_ID // Gen=3
...
Gen_ID // Gen=4
...

SET GENERATOR 10 // Gen = 10
Gen_ID // Gen=11
...
Gen_ID // Gen=12
...
Gen_ID // Gen=13
...

Trans1.Rollback

И вот куда теперь откатывать генератор ? на 1 или на 10 ?

На 1 ?
А если пока еще генератор не был "залочен" через DDL параллельные транзакции им тоже пользовались?

На 10?
А если внутри транзакции несколько SET GENERATOR ?
То есть транзакция откатывается лишь частично ?

IMHO это было правильно, что у SET_GENERATOR был отдельный тип команды, генераторы - вполне себе особый вид сущностей.
...
Рейтинг: 0 / 0
Транзакционные генераторы
    #38853057
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

Кстати, хорший вопрос. Что будет делать GEN_ID(xxx), GEN_ID(xxx, +1) и SELECT NEXT FROM xxx на верхней границе? Свернётся или (лучше) выдаст ошибку?
...
Рейтинг: 0 / 0
Транзакционные генераторы
    #38853068
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
Код: sql
1.
SELECT  GEN_ID(MYGEN, 9223372036854775806) AS n FROM RDB$DATABASE

у мну пока нет циклов с таким числом итераций... не дорос еще как бэ...
...
Рейтинг: 0 / 0
Транзакционные генераторы
    #38853069
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

проверь. У меня в минус просто ушёл
...
Рейтинг: 0 / 0
Транзакционные генераторы
    #38853074
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

не это про то что "Нельзя менять в сторону уменьшения." Как видишь в сторону увеличения тоже траблы могут быть
...
Рейтинг: 0 / 0
Транзакционные генераторы
    #38853092
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисв сторону увеличения тоже траблы могут бытьЭто "слишком смелое" увеличение. Примерно как то, которое об столб ломается, когда "с дуру"
...
Рейтинг: 0 / 0
Транзакционные генераторы
    #38853093
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис> не это про то что "Нельзя менять в сторону уменьшения."
Симонов Денис> Как видишь в сторону увеличения тоже траблы могут быть

Шо, увлечение синтетическими поисками крайностей и пр. т.п. и тебя затронуло?
Это что, заразно и передаётся воздушно-электронным путём?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Транзакционные генераторы
    #38853095
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Буй, не столб.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Транзакционные генераторы
    #38853151
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

проблема с "синтетическими поисами крайностей", что про это нафиг забывают в иотге ,а потом лет через 15-20-30 оппа, ошибка 2000 или что-то вроде
...
Рейтинг: 0 / 0
Транзакционные генераторы
    #38853156
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
то есть да, сейчас в 99,99% случаев заворачивание счетчика не актуаьлно.

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

это всего лишь ответ на то что увеличение генератора всегда безопасно. Не всегда. Пусть даже тест и синтетический
...
Рейтинг: 0 / 0
Транзакционные генераторы
    #38853169
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochНо если когда оно станет актуально, про него могут просто не вспомнитьПереход счетчика через 2^63-1 придется долго ждать, если двигаться к нему с шагом = 1. Даже если будут системы со 100 млн транзакциями в секунду...
Код: plaintext
1.
2.
3.
4.
5.
SQL> select power(2,63)/100000000/365.25/24/60/60 from rdb$database;

                 DIVIDE
=======================
      2922.710230453132
PS. "Через 30 лет другие коммунисты ответят перед партией!" (С) к/ф "Зеркало для героя", 1987.
...
Рейтинг: 0 / 0
Транзакционные генераторы
    #38853215
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

но один из способов разносить данные по "филиалам" как раз был через раздачу крупных пулов номеров Primary Key.

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

пример был приведён лишь в качестве демонстрации, что злоумышленник может и без уменьшения значения генератора напортачить
...
Рейтинг: 0 / 0
Транзакционные генераторы
    #38853250
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch> а потом лет через 15-20-30 оппа, ошибка 2000 или что-то вроде

И? Ну будет не 2000, а 3000. Нет, лучше 5000.

Голову лечить надо просто.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Транзакционные генераторы
    #38853642
NikolayV81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochТаблоид,

но один из способов разносить данные по "филиалам" как раз был через раздачу крупных пулов номеров Primary Key.

Впрочем, согласен, жить с этим уже не нам

Проблема скорее в том что во многих системах это число сильно меньше 2:63/"кол-во филиалов" ;)
...
Рейтинг: 0 / 0
22 сообщений из 47, страница 2 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Транзакционные генераторы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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