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

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

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

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

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

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

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

Прочитай о пессимистических блокировках записей.
...
Рейтинг: 0 / 0
20.06.2016, 10:16
    #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
20.06.2016, 10:37
    #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
20.06.2016, 11:26
    #39258717
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование пулла значений
хрень
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.06.2016, 12:15
    #39258759
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование пулла значений
Мимопроходящий, аргументируй.
...
Рейтинг: 0 / 0
20.06.2016, 12:37
    #39258784
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование пулла значений
rdb_dev,

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

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

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

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

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



проверять IS NOT NULL и сравнивать со значением одновременно абсолютно бессмысленно.
...
Рейтинг: 0 / 0
20.06.2016, 13:33
    #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
20.06.2016, 13:40
    #39258844
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование пулла значений
Мимопроходящийне люблю школьниковНуждаешься в моем сочувствии?
...
Рейтинг: 0 / 0
20.06.2016, 14:00
    #39258863
miwaonline
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование пулла значений
Симонов Дениспопыткой использовать ROWS там где должен быть FIRST
Я всю жизнь считал, что first и rows эквивалентны, только first - более ранний ФБ-шный вариант синтаксиса, а rows - стандарт. Разве не так?
...
Рейтинг: 0 / 0
20.06.2016, 14:06
    #39258870
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование пулла значений
miwaonline,

да что же вы такие невнимательные сегодня. Где должен быть ROWS? Правильно в самом конце оператора SELECT обычно сразу после ORDER BY.
А где FIRST? Сразу же после ключевого слова SELECT.
...
Рейтинг: 0 / 0
20.06.2016, 14:10
    #39258871
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование пулла значений
Автономные транзакции? Таймштампы? Больше ада!
Ещё совсем недавно школьники решали проблему блокировки записи обычным уникальным индексом (для обеспечения видимости в любой транзакции)
...
Рейтинг: 0 / 0
20.06.2016, 14:13
    #39258875
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование пулла значений
WildSeryЕщё совсем недавно школьники решали проблему блокировки записи обычным уникальным индексом (для обеспечения видимости в любой транзакции)И?...
Какая постановка задачи, такая и реализация.
...
Рейтинг: 0 / 0
20.06.2016, 14:14
    #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
20.06.2016, 14:16
    #39258879
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование пулла значений
rdb_devКакая постановка задачи, такая и реализация. Вот что-то сомневаюсь, что у тебя другая реализация бывает.
...
Рейтинг: 0 / 0
20.06.2016, 14:22
    #39258881
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование пулла значений
Симонов ДенисЧитай ещё раз. Ошибка в синтаксисе. FIRST и ROWS абсолютно равноправны. И тот и другой не по стандарту. Это предложение более или менее справедливо для 2.5. Взято из LRU, когда авторы были уверены что это соответствует стандарту. На самом деле в стандарте оно появилось довольно поздно (ЕМНИП SQL:2008). По стандарту появилось только в 3.0 и в доке по 3.0 я эту фразу переписал.Ошибки в синтаксисе легко отлавливаемы, а смысл остается прежним. Не придирайся.
...
Рейтинг: 0 / 0
20.06.2016, 14:23
    #39258883
miwaonline
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование пулла значений
Симонов Денисда что же вы такие невнимательные сегодня.
:-[

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

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

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


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