Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / No data - zero rows fetched, selected, or processed / 6 сообщений из 6, страница 1 из 1
20.08.2013, 13:53:50
    #38371925
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
No data - zero rows fetched, selected, or processed
Суть такова:
Есть таблица, в которую вставляются записи, иногда (пока не ясно почему), случается ошибка:

Код: sql
1.
Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction. The SQL statement executed was: INSERT INTO `fh_user_file`....



Проблема как бы была пока заплатана тем, что перезапускалась транзакция (она там вообще не явная, просто запрос запрос на ИНСЕРТ и все...)
Недавно в триггер (BEFORE INSERT) было добавлено:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  SELECT check_stop_words(NEW.name) INTO stop_word_id;
  IF stop_word_id IS NOT NULL THEN
    SELECT word, type
      INTO stop_word_name, stop_word_type
      FROM fh_stop_word WHERE id = stop_word_id;
    IF stop_word_type = STOP_WORD_TYPE_NOTIFY THEN
      INSERT INTO fh_stop_word_notify (user_id, user_file_id, stop_word_id, old_file_name)
      VALUES (NEW.user_id, NEW.id, stop_word_id, NEW.name);
    ELSEIF stop_word_type = STOP_WORD_TYPE_BLOCK THEN
      SET NEW.blocked = 1;
      INSERT INTO fh_user_file_log (user_file_id, date, operation)
        VALUES (NEW.id, NOW(), 6);
    END IF;
  END IF;



Функция:

Код: sql
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.
CREATE FUNCTION check_stop_words(p_text TEXT)
  RETURNS int(11)
  SQL SECURITY INVOKER
BEGIN

  DECLARE c_word VARCHAR(255);
  DECLARE c_type TINYINT;
  DECLARE c_word_id INT UNSIGNED;
  DECLARE done INT DEFAULT FALSE;
  DECLARE sw_cursor CURSOR FOR SELECT id, word, type FROM fh_stop_word;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  OPEN sw_cursor;
  REPEAT
    FETCH sw_cursor INTO c_word_id, c_word, c_type;
    IF NOT done THEN
      IF p_text LIKE CONCAT('%', c_word, '%') THEN
        CLOSE sw_cursor;
        RETURN c_word_id;
      END IF;
    END IF;
  UNTIL done END REPEAT;

  CLOSE sw_cursor;
  RETURN NULL;
END



Теперь при повторном инсерте стабильно вылетает ошибка:

Код: sql
1.
SQLSTATE[02000]: No data: 1329 No data - zero rows fetched, selected, or processed. The SQL statement executed was: INSERT INTO `fh_user_file`



И только еще одна попытка потом сохраняет данные.
Вообще где-то читал, что при ошибке "Deadlock found when trying to get lock; try restarting transaction." желательно повторять запрос в новой сессии, но как-то не нашел веских причин. Кто что думает?
...
Рейтинг: 0 / 0
20.08.2013, 14:14:46
    #38371948
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
No data - zero rows fetched, selected, or processed
Мда... функция - просто песня... за каким хреном там курсор, кто бы сказал, когда можно просто

Код: sql
1.
2.
3.
4.
SELECT id INTO c_word_id
FROM fh_stop_word
WHERE p_text LIKE CONCAT('%', c_word, '%')
LIMIT 1;



?
...
Рейтинг: 0 / 0
20.08.2013, 14:21:19
    #38371959
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
No data - zero rows fetched, selected, or processed
блин, там раньше еще дополнительный инсерт в лог делался, потом инсерт убрали а все осталось и как-то даже не задумался
...
Рейтинг: 0 / 0
20.08.2013, 14:39:17
    #38371977
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
No data - zero rows fetched, selected, or processed
Короче без курсора вторая часть проблемы не проявляется.
Почему она была?
Первую возможно решить?)
...
Рейтинг: 0 / 0
20.08.2013, 15:18:37
    #38372044
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
No data - zero rows fetched, selected, or processed
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT id, type 
  INTO stop_word_id, stop_word_type
  FROM fh_stop_word
  WHERE type in (STOP_WORD_TYPE_NOTIFY,STOP_WORD_TYPE_BLOCK)
    and InStr(NEW.name,word)>0
  LIMIT 1;
IF stop_word_type=STOP_WORD_TYPE_NOTIFY THEN
  INSERT INTO `fh_stop_word_notify` (user_id, user_file_id, stop_word_id, old_file_name)
    VALUES (NEW.user_id, NEW.id, stop_word_id, NEW.name);
ELSEIF stop_word_type = STOP_WORD_TYPE_BLOCK THEN
  SET NEW.blocked = 1;
  INSERT INTO `fh_user_file_log` (user_file_id, date, operation)
    VALUES (NEW.id, NOW(), 6);
END IF;



про Deadlock куча всего, например, Немного про Deadlock , yandsearch mysql deadlock

Hett
Код: plaintext
SQLSTATE[02000]: No data: 1329 No data - zero rows fetched, selected, or processed. The SQL statement executed was: INSERT INTO `fh_user_file`
fh_user_file - не участвует в приведенном ранее запросе.
...
Рейтинг: 0 / 0
21.08.2013, 10:52:29
    #38372866
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
No data - zero rows fetched, selected, or processed
Cygapb-007 fh_user_file - не участвует в приведенном ранее запросе.
Ранее приведенные запросы участвуют в запросе к fh_user_file. Триггер жеж.

авторпро Deadlock куча всего, например
Да читал, правда так и не понял, возможно ошибка происходит где-то в другом запросе в триггере опять же.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / No data - zero rows fetched, selected, or processed / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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