Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FireDAC, Firebird: deadlock / 25 сообщений из 36, страница 1 из 2
09.03.2021, 15:37
    #40051962
scorpion235
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Firebird: deadlock
Окружение:
Delphi 10.4.1
Firebird 3.0.7
FireDAC (TFDConnection, TFDTransaction, TFDQuery)

Основные настройки компонентов для доступа к базе данных:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
  object FDConnection: TFDConnection
  ...
  object FDTransactionSeveralOpers: TFDTransaction
    Options.Isolation = xiReadCommitted
    Options.AutoStart = False
    Options.AutoStop = False
    Options.DisconnectAction = xdRollback
    Connection = FDConnection
  ...
  object FDQuerySeveralOpers: TFDQuery
    BeforeOpen = FDQuerySeveralOpersBeforeOpen
    BeforeExecute = FDQuerySeveralOpersBeforeExecute
    Connection = FDConnection
    Transaction = FDTransactionSeveralOpers
  ...
  end


Вызываю хранимку, для определенных данных в самой хранимке генерируется исключение, на клиенте обрабатываю исключение, всё хорошо. Но при повторном запросе к этой хранимке возникает deadlock как будто предыдущая транзакция еще активна, не произошел rollback
Код: pascal
1.
2.
3.
[FireDAC][Phys][FB]deadlock
update conflicts with concurrent update
concurrent transaction number is 9204


Сам обработчик Delphi:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
FDQuerySeveralOpers.Transaction.StartTransaction;

...

try
  FDQuerySeveralOpers.ExecSQL;
except on e: Exception do
begin
  //разбор exception, вывод сообщения об ошибке
  
  ...

  if (FDQuerySeveralOpers.Transaction.Active) then
    DataMod.FDQuerySeveralOpers.Transaction.Rollback;

  exit;
end;
end;

DataMod.FDQuerySeveralOpers.Close; //в случае успеха
DataMod.FDQuerySeveralOpers.Transaction.Commit; //в случае успеха



Просьба подсказать как победить deadlock
...
Рейтинг: 0 / 0
09.03.2021, 15:39
    #40051966
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Firebird: deadlock
scorpion235Просьба подсказать как победить deadlock

Во-первых, это не дедлок, а конфликт обновлений.
Во-вторых, включить аудит и смотреть когда и как реально транзакции заканчиваются.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
09.03.2021, 15:54
    #40051977
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Firebird: deadlock
09.03.2021 15:37, scorpion235 пишет:
> Просьба подсказать как победить deadlock

1. это не дедлок.
это конфликт при обновлении.
У Isolation = xiReadCommitted есть два режима: RecordVersion и NoRecordVersion.
какой выставлен у тебя?

2. смотри виновника в MON$TRANSACTIONS + MON$ATTACHMENTS
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
09.03.2021, 19:04
    #40052076
scorpion235
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Firebird: deadlock
Мимопроходящий

У Isolation = xiReadCommitted есть два режима: RecordVersion и NoRecordVersion.
какой выставлен у тебя?

Не вижу таких режимов. Где их можно выставить?
...
Рейтинг: 0 / 0
09.03.2021, 19:26
    #40052081
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Firebird: deadlock
Немного не в тему, но алгоритм управления транзакцией должен быть таким
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
FDQuerySeveralOpers.Transaction.StartTransaction;
try
   ....
  FDQuerySeveralOpers.Transaction.Commit;
except
  FDQuerySeveralOpers.Transaction.Rollback;
  raise
end;
...
Рейтинг: 0 / 0
09.03.2021, 21:44
    #40052107
Dmitry Arefiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Firebird: deadlock
Мимопроходящий

У Isolation = xiReadCommitted есть два режима: RecordVersion и NoRecordVersion.

FireDAC сам ничего не выставляет, то есть по умолчанию.
Далее, можно положить в TxOptions.Params - rec_version или no_rec_version.
...
Рейтинг: 0 / 0
09.03.2021, 22:38
    #40052113
scorpion235
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Firebird: deadlock
_Vasilisk_,

хороший стиль кодирования
...
Рейтинг: 0 / 0
09.03.2021, 23:50
    #40052119
scorpion235
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Firebird: deadlock
Dmitry Arefiev,

Перед стартом новой sql-операции помогла дополнительная проверка и ошибка ушла:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
  with (DataMod.FDQuery) do
  begin
    if (Active) then
      Close;

    if (Transaction.Active) then
      Transaction.Rollback;
  end;


  with (DataMod.FDQueryMultiple) do
  begin
    if (Active) then
      Close;

    if (Transaction.Active) then
      Transaction.Rollback;
  end;
...
Рейтинг: 0 / 0
09.03.2021, 23:58
    #40052120
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Firebird: deadlock
scorpion235,

почему Rollback? Тебе не нужно то, что предыдущий запрос выполнил?
...
Рейтинг: 0 / 0
10.03.2021, 11:24
    #40052195
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Firebird: deadlock
scorpion235
помогла дополнительная проверка
И опять написана чушь

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
FDQuerySeveralOpers.Transaction.StartTransaction;
try
  FDQuerySeveralOpers.ExecSQL;
  try
     ....
  finally
    FDQuerySeveralOpers.Close;
  end;
  FDQuerySeveralOpers.Transaction.Commit;
except
  FDQuerySeveralOpers.Transaction.Rollback;
  raise
end;

И никаких проверок и зависимостей от наличия ошибок
...
Рейтинг: 0 / 0
10.03.2021, 11:42
    #40052205
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Firebird: deadlock
10.03.2021 11:24, _Vasilisk_ пишет:
> И никаких проверок и зависимостей от наличия ошибок

а raise то нафига?

не, конечно я понимаю что ты написал ему шаблон.
но он же будет теперь везде его пихать,
считая что так надо делать всегда.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.03.2021, 12:06
    #40052225
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Firebird: deadlock
Dmitry Arefiev
FireDAC сам ничего не выставляет, то есть по умолчанию.
очень плохо.
всё нужно задавать явным способом.
API Guide Isolation level describes the view of the database given a transaction as it relates to
actions performed by other simultaneously occurring transactions.
Valid isolation levels are:
  • isc_tpb_concurrency
  • isc_tpb_consistency
  • isc_tpb_read_committed , isc_tpb_rec_version
  • isc_tpb_read_committed , isc_tpb_no_rec_version
если ты не указываешь явно параметр для read_committed , то по умолчанию наивный ламер получает ЖОПУ.
API Guide isc_tpb_no_rec_version - the default refinement , specifies that
a transaction can only read the latest version of a row.
If a change to a row is pending, but not yet committed,
the row cannot be read.
что мы сейчас и наблюдаем.
...
Рейтинг: 0 / 0
10.03.2021, 12:48
    #40052246
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Firebird: deadlock
Мимопроходящий
а raise то нафига?

Просто втихую зароллбачить? :)
...
Рейтинг: 0 / 0
10.03.2021, 12:52
    #40052254
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Firebird: deadlock
10.03.2021 12:48, ъъъъъ пишет:
> Просто втихую зароллбачить? :)

втихую не надо.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.03.2021, 12:54
    #40052256
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Firebird: deadlock
Мимопроходящий
10.03.2021 12:48, ъъъъъ пишет:
> Просто втихую зароллбачить? :)

втихую не надо.

На то и raise.
...
Рейтинг: 0 / 0
10.03.2021, 13:00
    #40052264
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Firebird: deadlock
10.03.2021 12:54, ъъъъъ пишет:
> На то и raise.

ты слишком оптимистичен, если полагаешь, что у ламера стоит централизованный обработчик OnException

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.03.2021, 13:16
    #40052272
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Firebird: deadlock
Мимопроходящий,

какой же он ламер, он статьи на хабре (и т.д.) пишет: https://www.sql.ru/forum/1287320/delphi-samyy-bystryy-dataset-tjvmemorydata-tmemtableeh-tdxmemdata-tkbmmemtable
...
Рейтинг: 0 / 0
10.03.2021, 13:21
    #40052274
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Firebird: deadlock
Мимопроходящийты слишком оптимистичен, если полагаешь, что у ламера стоит централизованный обработчик
OnException

Он стоит в TApplication, этого достаточно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.03.2021, 13:28
    #40052277
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Firebird: deadlock
10.03.2021 13:16, ъъъъъ пишет:
> какой же он ламер, он статьи на хабре (и т.д.) пишет

на хабре одни питарасы! ©
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.03.2021, 15:09
    #40052330
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Firebird: deadlock
Но не ламеры же.
...
Рейтинг: 0 / 0
10.03.2021, 15:18
    #40052332
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Firebird: deadlock
ъъъъъНо не ламеры же.

Наоборот. Именно этим ламеры и отличаются от чайников.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.03.2021, 22:55
    #40052468
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Firebird: deadlock
Не отменяя всего вышесказанного (по поводу транзакций и последующих поруганий), отмечу некоторую сугубую антиэстетику в упорно продвигаемом .Close в совокупности с .ExecSQL.))
...
Рейтинг: 0 / 0
10.03.2021, 22:57
    #40052469
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Firebird: deadlock
Vlad F
Не отменяя всего вышесказанного (по поводу транзакций и последующих поруганий), отмечу некоторую сугубую антиэстетику в упорно продвигаемом .Close в совокупности с .ExecSQL.))
Ну правильно, зачем ему активным на сервере висеть.
...
Рейтинг: 0 / 0
10.03.2021, 23:27
    #40052475
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Firebird: deadlock
YuRock,

Кому висеть? =8-[ ]

Я спросил электрика Петрова:
— Для чего ты намотал на шею провод?
Петров мне ничего не отвечает,
Висит и только ботами качает.
...
Рейтинг: 0 / 0
10.03.2021, 23:33
    #40052476
Dmitry Arefiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Firebird: deadlock
Мимопроходящий
Dmitry Arefiev
FireDAC сам ничего не выставляет, то есть по умолчанию.
очень плохо.

Файрдак оставляет дефолтный режим изоляции / настройки транзакции, как он есть в БД. Достаточно один раз выставить в TFDConnection.TxOptions.Isolation и далее так и будет в приложении. Попытка установить некоторый дефолтный режим изоляции транзакции привела к тому, что у некоторых все пошло лесом, например в MySQL. Поэтому - дефолтный для СУБД А дальше - инструмент есть ... Нет мозгов - я не врачь ...
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FireDAC, Firebird: deadlock / 25 сообщений из 36, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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