powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FireDAC, Firebird: deadlock
25 сообщений из 36, страница 1 из 2
FireDAC, Firebird: deadlock
    #40051962
scorpion235
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Окружение:
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
FireDAC, Firebird: deadlock
    #40051966
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scorpion235Просьба подсказать как победить deadlock

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

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

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

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

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

хороший стиль кодирования
...
Рейтинг: 0 / 0
FireDAC, Firebird: deadlock
    #40052119
scorpion235
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
FireDAC, Firebird: deadlock
    #40052120
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
scorpion235,

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

а raise то нафига?

не, конечно я понимаю что ты написал ему шаблон.
но он же будет теперь везде его пихать,
считая что так надо делать всегда.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FireDAC, Firebird: deadlock
    #40052225
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
FireDAC, Firebird: deadlock
    #40052246
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мимопроходящий
а raise то нафига?

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

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

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

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

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

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

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

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

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

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

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

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

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


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