powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Хранимая функция ИНОГДА дублирует своё выполнение
18 сообщений из 18, страница 1 из 1
Хранимая функция ИНОГДА дублирует своё выполнение
    #38325824
fezilk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

В приложении используется связь с удаленной БД MySQL.
Т.к. в нем идёт обработка очень важных данных (бухгалтерия), решил все добавления/изменения/удаления записей записывать в отдельную таблицу, т.е. вести лог.

В целях бехопасности и для удобства реализовал это с помощью хранимых функций. Проверил - всё работает.
Вчера посомтрел логи, и обнаружил, что некоторые записи дублируются, а некоторые - нет. Не могу понять в чём дело. Функция вызывается один раз, а выполняется от 1 до 3 раз.

При чем на моём ПК дублирования ни разу не происходило, а на ПК сотрудников происходит...

Что это может быть? Какие есть мысли?

Заранее спасибо!

Прилагаю скриншот.
...
Рейтинг: 0 / 0
Хранимая функция ИНОГДА дублирует своё выполнение
    #38325829
fezilk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извиняюсь, забыл: вот код функции.
Код: 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.
DELIMITER // 
DROP FUNCTION  IF EXISTS `editBuhRas`//
CREATE FUNCTION `editBuhRas` (name VARCHAR(255), col INT, oldtext VARCHAR(255), newtext VARCHAR(255), idc INT, month INT, year INT, user INT, ra1 INT) RETURNS VARCHAR(255) NON DETERMINISTIC
BEGIN

        IF col=2 THEN
            UPDATE `buhras` SET `name`=newtext WHERE `id`=idc; 
        END IF;
        IF col=3 THEN 
            UPDATE `buhras` SET `otdnal`=newtext WHERE `id`=idc;
        END IF;
        IF col=4 THEN 
            UPDATE `buhras` SET `otdbnal`=newtext WHERE `id`=idc;
        END IF;
        IF col=5 THEN 
            UPDATE `buhras` SET `dol`=newtext WHERE `id`=idc; 
        END IF;
        IF col=6 THEN 
            UPDATE `buhras` SET `prognoz`=newtext WHERE `id`=idc; 
        END IF;
        IF col=7 THEN 
            UPDATE `buhras` SET `date`=newtext WHERE `id`=idc; 
        END IF;
        IF col=8 THEN 
            UPDATE `buhras` SET `comment`=newtext WHERE `id`=idc;
        END IF;    
    
    INSERT INTO `buhlog`(`user`, `table`, `action`, `name`, `column`, `oldtext`, `newtext`, `date`, `time`, `id`, `month`, `year`, `ra`) VALUES 
    (user,2,2,name,col,oldtext,newtext, CONCAT(YEAR(adddate(NOW(), INTERVAL 2 HOUR)),"-",MONTH(adddate(NOW(), INTERVAL 2 HOUR)),"-",DAYOFMONTH(adddate(NOW(), INTERVAL 2 HOUR))),addtime(CURRENT_TIME, '2:00:00.000000'),NULL, month, year, ra1);
    RETURN 'ok';
END//
...
Рейтинг: 0 / 0
Хранимая функция ИНОГДА дублирует своё выполнение
    #38325840
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fezilk,

а почему вы думаете, что виновата функция?

На мой взгляд виноват либо юзер, который что-то там дважды нажимает, либо код, который вызывает эту функцию.
...
Рейтинг: 0 / 0
Хранимая функция ИНОГДА дублирует своё выполнение
    #38325842
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fezilk,

кстати, возня с двумя часами очень похожа на костыль и может аукнуться в будущем.
...
Рейтинг: 0 / 0
Хранимая функция ИНОГДА дублирует своё выполнение
    #38325868
fezilk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

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

Например:
в ячейке "должны" было число 5000. пользователь заходит в эту ячейку, пишет 6000, тыкает enter - посылается запрос.
заходит еще раз в ячейку - ничего не изменяет, тыкает enter - запрос не идет.

Поэтому, скорее всего, виновата функция..

Костыль с часами - это часовая зона (+2ч. от сервера), это лишь для удобства просмотра лога и нигде не используется больше.
...
Рейтинг: 0 / 0
Хранимая функция ИНОГДА дублирует своё выполнение
    #38325881
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fezilkmiksoft,

дело в том, что приложение не пошлет запрос, если данные в ячейке таблицы не изменились.Но время-то в логе разное. Что может программа делать 6 секунд?

Кстати, триггеров на таблицах нет?
...
Рейтинг: 0 / 0
Хранимая функция ИНОГДА дублирует своё выполнение
    #38325888
fezilk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

триггеров нет..
а есть идеи, как можно отловить, например, второй вызов функции?
...
Рейтинг: 0 / 0
Хранимая функция ИНОГДА дублирует своё выполнение
    #38325904
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fezilkКостыльиспользовали бы timestamp вместо двух полей дата+время, и можно было бы не городить огород, а воспользоваться этим http://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html
...
Рейтинг: 0 / 0
Хранимая функция ИНОГДА дублирует своё выполнение
    #38325906
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А еще вы неправильно логируете oldtext.
Процедура не должна верить тому, что приходит извне и должна сама читать данные из таблицы.


Мог произойти примерно такой сценарий:
сессия1сессия2чтение--чтениезапись--записькаждая из сессий получает команду на редактирование, видит, что данные изменились и производит изменения.
Это архитектурный просчет, имхо. Система не должна позволять менять что-то, если другой пользователь/сессия взяли этот бизнес-объект (накладная, заказ и т.п.) на редактирование.
...
Рейтинг: 0 / 0
Хранимая функция ИНОГДА дублирует своё выполнение
    #38325972
fezilk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

хм.. да, нужно разобраться с этим, спасибо за подсказку.

но, думаю, такой сценарий не происходил - ID юзера были бы разные
...
Рейтинг: 0 / 0
Хранимая функция ИНОГДА дублирует своё выполнение
    #38325984
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fezilkно, думаю, такой сценарий не происходил - ID юзера были бы разныеОдин юзер не мог залогиниться дважды в двух запущенных программах?
...
Рейтинг: 0 / 0
Хранимая функция ИНОГДА дублирует своё выполнение
    #38325991
fezilk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

теоретически - мог, но не было такого - узнал сейчас.
...
Рейтинг: 0 / 0
Хранимая функция ИНОГДА дублирует своё выполнение
    #38325994
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fezilk,

Тогда ищите ошибку в коде программы.
Возможно, при проверке необходимости изменений она руководствуется "несвежими" данными.
...
Рейтинг: 0 / 0
Хранимая функция ИНОГДА дублирует своё выполнение
    #38326001
fezilk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

Кстати, еще один интересный момент: (см. скришот в первом посте) запись с id 833 дублирует предыдущую, но у нее указан другой месяц (7 вместо 6).
Проверил вручную - записи "руководители" не было в июле.

Возможно ли, что при одновременной работе двух сотрудников в таблицей (в разных строках), данные каким-то образом перемешиваются и из-за этого пишется неправильный лог?
Если да,то как можно это устранить?

Структура такая: есть таблица "ДОХОД" за июль, в ней около 100 строк. Один пользователь редактирует первую строку, второй - сотую. (При редактировании вызывается одна и та же функция, ей передаются параметры, к-ые нужно изменить)
...
Рейтинг: 0 / 0
Хранимая функция ИНОГДА дублирует своё выполнение
    #38326004
fezilk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fezilk,

опять же, в 10 вечера несколько сотрудников работать не могут.. значит работал один юзер, при этом дублировалась запись с задержкой в 9 секунд и неправильным месяцем..
...
Рейтинг: 0 / 0
Хранимая функция ИНОГДА дублирует своё выполнение
    #38326023
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fezilkmiksoft,

Кстати, еще один интересный момент: (см. скришот в первом посте) запись с id 833 дублирует предыдущую, но у нее указан другой месяц (7 вместо 6).
Проверил вручную - записи "руководители" не было в июле.Тогда тем более ищите ошибки в программе.
Не забудьте переделать логирование oldtext, о чем я писал выше. Возможно, это что-то прояснит.
...
Рейтинг: 0 / 0
Хранимая функция ИНОГДА дублирует своё выполнение
    #38326184
fezilk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в программе ошибок не нашел, временно заменил функции на триггеры - посмотрим, будет ли дублирование с ними.
отпишусь о результатах.
...
Рейтинг: 0 / 0
Хранимая функция ИНОГДА дублирует своё выполнение
    #38346947
fezilk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Очень странно, но дублирование исчезло (заменил функции на триггеры).
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Хранимая функция ИНОГДА дублирует своё выполнение
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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