powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
25 сообщений из 78, страница 2 из 4
Форумяне, есть желание обсудить необходимость пары новых функций для работы с 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
25 сообщений из 78, страница 2 из 4
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Форумяне, есть желание обсудить необходимость пары новых функций для работы с SEQUENCE
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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