Перейти к содержимому


Публикации useYourBrain

1 публикаций создано useYourBrain (учитываются публикации только с 29-Март 23)


#31194 Условие запуска вычисления "До вставки в таблицу"

Отправлено от useYourBrain в 14 Апрель 2016 - 05:54 in Предложения по доработке

Добрый день,

А почему среди триггеров вычислений нет события "Перед сохранением/вставкой"?

Приведу реальный пример: пусть продается некий дорогостоящий товар (таблица "Товары"), на поставку которого заключается договор (таблица "Договоры"), причем оплата по договору может быть договорной - вся сумма сразу либо рассрочка: "Договор" имеет поле-список "Тип оплаты"=[Сразу|В рассрочку] и соответственно два поля "Рассрочка: Годовой процент", "Рассрочка: Срок в месяцах". Обязательными для заполнения поля отметить не могу, т.к. тип оплаты может быть разный. Таким образом еще до вставки в таблицу необходимо убедиться в корректности введенных данных и если что-то не так - вообще не записывать ничего в базу, ибо сохранение чревато дальнейшими ошибками - человек может просто не заметить того, что сделал, а более того еще и пойти вносить платежи в ошибочный договор.

Проверять и удалять запись внутри вычислений "Сохранение в таблице" не предлагать - риск сбоя есть всегда и запись просто повиснет в базе.

JavaScript тоже - это проверка только на стороне клиента. В его обход всегда можно подсунуть на сервер любые данные - достаточно его просто отключить. Так надежные приложения не разрабатываются.

И встречный вопрос - есть ли 100% гарантия, что после вставки/обновления записи вычисления обязательно будут вызваны и отработают до конца, а в ином случае база останется в нетронутом состоянии? Работает ли ваше ядро по такому алгоритму?

/* ... где-то в недрах зашифрованных Zend'ом скриптов находится обработчик, запускающийся после нажатия кнопки Сохранить... */

/* Подключаемся к базе */
$link = mysqli_connect(...);

/* >> В обязательном порядке открываем новую транзакцию, прежде чем что-то изменять << */
mysqli_autocommit($link, FALSE);

/* Обновляем данные записи в таблице в рамках транзакции */
mysqli_query(...);

/* Вызываем вычисления по триггеру "Сохранение в таблице" */
calc_save();

/* >> И только после всех этих действий закрываем транзакцию << */
mysqli_commit($link);


Как еще более строгий вариант - передавать в вычисления кроме $line еще и объект $link, обязав разработчика конфигурации работать только через него и в конце самому вызывать commit транзакции. И вот тогда любая работа с записями действительно будет одной цельной операцией. Иначе при любом сбое между инструкциями - сбой по питанию, например - который произойдет до завершения вычислений - и в базе окажется непредсказуемый хаос. Запись есть, а другие данные, с ней связанные окажутся испорчены или вообще не успеют появиться. Целостность данных должна быть в приоритете, ведь вы согласны?