powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Использование пулла значений
25 сообщений из 42, страница 1 из 2
Использование пулла значений
    #39258238
Игорь16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
День добрый.

есть табличка пул
ID / KEY / DT_USE

ключ используется один раз и отмечаем что он юзанный. все было отлично их использовали с одного рабочего места.
теперь обращение к табличке с нескольких мест, бывает одновременно, и естественно получаем деадлок

транзакция которая лезет в табличку живет до минуты, обычно меньше (так нужно по процессу)

вопрос как грамотно перепроектировать логику работы (или может работу транзакций, но блокировать всю таблицу на минуту не хорошо) чтоб избавится от деадлоков ?
...
Рейтинг: 0 / 0
Использование пулла значений
    #39258240
Игорь16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сервер 2,5 будет переход на 3,0 если это имеет значение.

пока писал, придумал что можно использовать отдельный генератор, который будет показывать на последнюю не использованную запись в таблице. правда в случае отмены транзакции, теряем один ключ. что не очень критично, но не хорошо.
...
Рейтинг: 0 / 0
Использование пулла значений
    #39258241
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь16транзакция которая лезет в табличку живет до минуты, обычно меньше (так нужно по процессу)

Значит придётся изменить процесс так, чтобы ключ получался отдельной транзакцией которая
гораздо короче. Или проанализировать зачем вообще этот ключ нужен и избавиться от него.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Использование пулла значений
    #39258646
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь16,

Прочитай о пессимистических блокировках записей.
...
Рейтинг: 0 / 0
Использование пулла значений
    #39258680
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь16, что мешает получать ключ другой транзакцией (короткой), при том, что первая транзакция будет продолжать висеть до минуты по бизнес логике? В таблицу ключей можно добавить поле TIMESTAMP и получать ключ короткой транзакцией из ХП примерно следующего вида:
Код: plsql
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.
SET TERM ^;
CREATE OR ALTER PROCEDURE getKey
  RETURNS
  (
    Id      type of column pool.id,
    Key     type of column pool.key,
    TmStmp  TIMESTAMP
  )
AS
BEGIN
  TmStmp = CURRENT_TIMESTAMP(3);
  UPDATE pool
    SET tmstmp = NULL
    WHERE dt_use IS NULL
      AND :TmStmp - tmstmp > 0.00138;
  FOR
      SELECT ROWS 1 id, key
        FROM pool
        WHERE dt_use IS NULL
          AND tmstmp IS NULL
        ORDER BY key
        FOR UPDATE WITH LOCK
        INTO: Id, Key
    DO
      BEGIN
        UPDATE pool
          SET tmstmp = :TmStmp
          WHERE id = :Id;
        SUSPEND;
      END
END^
SET TERM ;^


Подтверждение использования:
Код: plsql
1.
2.
3.
4.
UPDATE pool
  SET dt_use = 'Y'
  WHERE id = :Id
    AND tmstmp IS NOT NULL AND tmstmp = :TmStmp;

(не забыть поймать и проверить affected rows)
...
Рейтинг: 0 / 0
Использование пулла значений
    #39258692
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
EXECUTE BLOCK
AS
  DECLARE VARIABLE Id TYPE OF COLUMN pool.id DEFAULT NULL;
  DECLARE VARIABLE Key TYPE OF COLUMN pool.key DEFAULT NULL;
  DECLARE VARIABLE TmStmp TIMESTAMP DEFAULT NULL;
BEGIN
  IN AUTONOMOUS TRANSACTION DO
    SELECT Id, Key, TmStmp
      FROM getKey
      INTO: Id, Key, TmStmp;
  .
  . -- do something
  .
  IF (:Id IS NOT NULL) THEN
    UPDATE pool
      SET dt_use = 'Y'
      WHERE id = :Id
        AND tmstmp IS NOT NULL AND tmstmp = :TmStmp;
END
...
Рейтинг: 0 / 0
Использование пулла значений
    #39258717
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хрень
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Использование пулла значений
    #39258759
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий, аргументируй.
...
Рейтинг: 0 / 0
Использование пулла значений
    #39258784
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

Ты сам то свой способ пробовал?

Начнём с того что процедура getKey не скомпилируется в принципе. Следующий блок в купе с автономкой это просто лютый ...
Ну и попытка использовать время в качестве критерия в многопользовательской среде тоже.
...
Рейтинг: 0 / 0
Использование пулла значений
    #39258808
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисНачнём с того что процедура getKey не скомпилируется в принципе.Что именно тебя смущает в процедуре?

Симонов ДенисСледующий блок в купе с автономкой это просто лютый ...Чем? Тем, что автономная транзакция подтверждается до подтверждения родительской? Это нормальное поведение для автономной транзакции.

Симонов ДенисНу и попытка использовать время в качестве критерия в многопользовательской среде тоже.Не время, а пара Id+TmStmp. Штамп времени, в этом случае, используется для отлова "блокированных", но неиспользованных ключей, которые могут появиться при внештатно завершенных (в разрезе бизнес логики) транзакциях.
...
Рейтинг: 0 / 0
Использование пулла значений
    #39258815
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не люблю школьников
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Использование пулла значений
    #39258823
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devЧто именно тебя смущает в процедуре?

попыткой использовать ROWS там где должен быть FIRST
FOR SELECT + UPDATE + SUSPEND тоже не хорошо
Код: sql
1.
AND tmstmp IS NOT NULL AND tmstmp = :TmStmp;



проверять IS NOT NULL и сравнивать со значением одновременно абсолютно бессмысленно.
...
Рейтинг: 0 / 0
Использование пулла значений
    #39258838
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Дениспопыткой использовать ROWS там где должен быть FIRSTЦитата из Руководства по языку СУБД Firebird:
Внимание! FIRST и SKIP используются только в Firebird, они не включены в стандарт SQL. Рекомендуется использовать ROWS везде, где это возможно.

Симонов ДенисFOR SELECT + UPDATE + SUSPEND тоже не хорошоНе согласен. Оператор "SELECT" с "FOR UPDATE WITH LOCK", блокирующий необходимую запись до её фактического изменения, вполне "комильфо".

Симонов Денис
Код: sql
1.
AND tmstmp IS NOT NULL AND tmstmp = :TmStmp;

проверять IS NOT NULL и сравнивать со значением одновременно абсолютно бессмысленно.Согласен, но ошибки нет. AND в FirebirdSQL является "ленивой" операцией?
...
Рейтинг: 0 / 0
Использование пулла значений
    #39258844
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящийне люблю школьниковНуждаешься в моем сочувствии?
...
Рейтинг: 0 / 0
Использование пулла значений
    #39258863
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Дениспопыткой использовать ROWS там где должен быть FIRST
Я всю жизнь считал, что first и rows эквивалентны, только first - более ранний ФБ-шный вариант синтаксиса, а rows - стандарт. Разве не так?
...
Рейтинг: 0 / 0
Использование пулла значений
    #39258870
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miwaonline,

да что же вы такие невнимательные сегодня. Где должен быть ROWS? Правильно в самом конце оператора SELECT обычно сразу после ORDER BY.
А где FIRST? Сразу же после ключевого слова SELECT.
...
Рейтинг: 0 / 0
Использование пулла значений
    #39258871
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автономные транзакции? Таймштампы? Больше ада!
Ещё совсем недавно школьники решали проблему блокировки записи обычным уникальным индексом (для обеспечения видимости в любой транзакции)
...
Рейтинг: 0 / 0
Использование пулла значений
    #39258875
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSeryЕщё совсем недавно школьники решали проблему блокировки записи обычным уникальным индексом (для обеспечения видимости в любой транзакции)И?...
Какая постановка задачи, такая и реализация.
...
Рейтинг: 0 / 0
Использование пулла значений
    #39258877
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devЦитата из Руководства по языку СУБД Firebird:
Внимание! FIRST и SKIP используются только в Firebird, они не включены в стандарт SQL. Рекомендуется использовать ROWS везде, где это возможно.

Читай ещё раз. Ошибка в синтаксисе. FIRST и ROWS абсолютно равноправны. И тот и другой не по стандарту. Это предложение более или менее справедливо для 2.5. Взято из LRU, когда авторы были уверены что это соответствует стандарту. На самом деле в стандарте оно появилось довольно поздно (ЕМНИП SQL:2008). По стандарту появилось только в 3.0 и в доке по 3.0 я эту фразу переписал. Кому интересно по стандарту так:

Код: plaintext
1.
2.
3.
4.
5.
SELECT ...
FROM ...
[...]
[ORDER BY <expr_order_list>]
[OFFSET <simple_value_expr> {ROW | ROWS}]
[FETCH {FIRST | NEXT} [<simple_value_expr>] {ROW | ROWS} ONLY]
...
Рейтинг: 0 / 0
Использование пулла значений
    #39258879
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devКакая постановка задачи, такая и реализация. Вот что-то сомневаюсь, что у тебя другая реализация бывает.
...
Рейтинг: 0 / 0
Использование пулла значений
    #39258881
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисЧитай ещё раз. Ошибка в синтаксисе. FIRST и ROWS абсолютно равноправны. И тот и другой не по стандарту. Это предложение более или менее справедливо для 2.5. Взято из LRU, когда авторы были уверены что это соответствует стандарту. На самом деле в стандарте оно появилось довольно поздно (ЕМНИП SQL:2008). По стандарту появилось только в 3.0 и в доке по 3.0 я эту фразу переписал.Ошибки в синтаксисе легко отлавливаемы, а смысл остается прежним. Не придирайся.
...
Рейтинг: 0 / 0
Использование пулла значений
    #39258883
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисда что же вы такие невнимательные сегодня.
:-[

Могу только сказать, что в код rdb_dev я не всматривался, больше интересовала реакция на него :)

Симонов ДенисВзято из LRU, когда авторы были уверены что это соответствует стандарту. На самом деле в стандарте оно появилось довольно поздно (ЕМНИП SQL:2008). По стандарту появилось только в 3.0 и в доке по 3.0 я эту фразу переписал. Кому интересно по стандарту так
Вот ведь блин... век живи - век учись :/
...
Рейтинг: 0 / 0
Использование пулла значений
    #39258885
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSeryВот что-то сомневаюсь, что у тебя другая реализация бывает.У меня всякая реализация бывает... Чем эта плоха? Может, я что-то не учел?
...
Рейтинг: 0 / 0
Использование пулла значений
    #39258890
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miwaonline,

ну вот так вот получилось. Теперь к Firebird 3.0 у нас три конструкции которые выполняют почти одно и то же. Причём каждая со своими преимуществами и недостатками.
...
Рейтинг: 0 / 0
Использование пулла значений
    #39258916
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[offtop]
Симонов Денис, случайно не в курсе, где можно на халяву взять оригинал (англ.) свеженького описания стандарта SQL (ISO/IEC 9075:2011) или предыдущий (ISO/IEC 9075:2008)?
...
Рейтинг: 0 / 0
25 сообщений из 42, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Использование пулла значений
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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