Модераторы: Akella
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> deadlock на Firebird SS 2xx release, CentOS release 5 (final) 
:(
    Опции темы
tishaishii
Дата 2.4.2008, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

Репутация: нет
Всего: 8



Иногда при выполнении процедуры C_SESSION выдаётся ошибка:
Код

DBD::InterBase::st fetchrow_array failed: deadlock
-deadlock
-update conflicts with concurrent update
-At procedure 'UDT_SESSION'
At procedure 'C_SESSION'


Процедура:
Код

CREATE PROCEDURE C_SESSION (    ID_SESSION Varchar(32) )
RETURNS (
    DATE_LAST Timestamp )
AS
begin 
  IF(:ID_SESSION IS NOT NULL) THEN 
  BEGIN 
      SELECT DATE_LAST FROM S_SESSION(:ID_SESSION) INTO :DATE_LAST; 
      if (:DATE_LAST IS NULL) then 
        SELECT DATE_LAST FROM I_SESSION(:ID_SESSION) INTO :DATE_LAST; 
      else 
        SELECT DATE_LAST FROM UDT_SESSION(:ID_SESSION) INTO :DATE_LAST; 
  END 
  suspend; 
end


ID_SESSION создаётся с помощью односторонней функции шифрования из информации, введённой пользователем (имя\пароль). Процедура C_SESSION вызывается каждый раз при обращении пользователя c тем, чтобы вести о нём информацию (как-то его идентифицировать). I_SESSION - добавляет новую сессию. UDT_SESSION - обновляет дату последней активности пользователя. 

Что не так?
PM MAIL ICQ Skype   Вверх
Esperito
Дата 2.4.2008, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 2.9.2007

Репутация: нет
Всего: 3



Параметры у транзакции какие?
PM MAIL   Вверх
Deniz
Дата 3.4.2008, 05:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



tishaishii, покажи еще текст UDT_SESSION, потому как именно в ней ошибка.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
tishaishii
Дата 3.4.2008, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

Репутация: нет
Всего: 8



Код

CREATE PROCEDURE UDT_SESSION (    ID_SESSION Varchar(32) )
RETURNS (
    DATE_LAST Timestamp )
AS
begin 
  if (:ID_SESSION IS NOT NULL) then 
  BEGIN 
      SELECT current_timestamp FROM RDB$DATABASE INTO :DATE_LAST; 
      UPDATE 
        SESSION 
      SET 
        DATE_LAST=:DATE_LAST 
      WHERE 
        ID_SESSION=:ID_SESSION; 
  END 
  suspend; 
end

PM MAIL ICQ Skype   Вверх
Deniz
Дата 4.4.2008, 05:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



tishaishii, значит в момент обновления запись уже кем-то редактировалась и транзакция не подтверждена.
С процедурой UDT_SESSION проблем нет, теперь ищи в исходниках на клиенте.
Пользуешься ли конструкцией with lock в select?
Возможно где-то на клиенте посылается "холостой" update для блокировки записи.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
tishaishii
Дата 5.4.2008, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

Репутация: нет
Всего: 8



Блокировками не пользуюсь.
На клиенте искать не знаю где. Клиент у меня Firefox, который общается с apache2, который в свою очередь с firebird2.
PM MAIL ICQ Skype   Вверх
Deniz
Дата 7.4.2008, 05:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



Цитата(tishaishii @  5.4.2008,  15:33 Найти цитируемый пост)
Клиент у меня Firefox, который общается с apache2, который в свою очередь с firebird2. 
Ну аpache не сам же с FireBird общается. Есть наверное PHP или Perl. Там и смотри. К сожалению помочь в этом не смогу, не силен.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
tishaishii
Дата 15.4.2008, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

Репутация: нет
Всего: 8



Смотрел-засмотрелся. Проблема осталась.
Думаю, всё-таки, FB не многопоточная СУБД, в этом косяк.
PM MAIL ICQ Skype   Вверх
Esperito
Дата 16.4.2008, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 2.9.2007

Репутация: нет
Всего: 3



Цитата(tishaishii @ 15.4.2008,  15:46)
Думаю, всё-таки, FB не многопоточная СУБД, в этом косяк.

Прошу прощения? smile 

Рекомендую всё-таки отыскать параметры транзакции.
PM MAIL   Вверх
tishaishii
Дата 17.4.2008, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

Репутация: нет
Всего: 8



Какои транзакции? Какие параметры?
PM MAIL ICQ Skype   Вверх
Esperito
Дата 17.4.2008, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 2.9.2007

Репутация: нет
Всего: 3



Любая операция с базой в Firebird выполняется внутри какой-то транзакции с какими-то параметрами (читает/пишет, уровень изоляции транзакции). Вот в транзакции(-ях) с какими параметрами выполняются твои процедуры?
PM MAIL   Вверх
Fortop
Дата 17.4.2008, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: нет
Всего: 42



tishaishii, 
найди код в клиенте, где вызывается твоя ХП, и с каким параметром она вызывается.
Очень похоже, что ты пытаешься провести одновременно две транзакции. Не завершив другую.

К сожалению твой клиент на Perl, я его не знаю совсем.

В PHP выглядело бы примерно так
ibase_trans($flag);

где $flag одно из
  • IBASE_READ, 
  • IBASE_WRITE, 
  • IBASE_COMMITTED, 
  • IBASE_CONSISTENCY, 
  • IBASE_CONCURRENCY, 
  • IBASE_REC_VERSION, 
  • IBASE_REC_NO_VERSION, 
  • IBASE_WAIT, 
  • IBASE_NOWAIT
обрати внимание на отмеченное жирным


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




[ Время генерации скрипта: 0.0522 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.