DeadMorozBLR
Новичок
Переполнение поля численного типа
Есть поле, содержащее сумму на счете пользователя, к примеру, DECIMAL(6,2). Добавление суммы на счет выполняется запросом вида "UPDATE `table` SET `field` = `field` + $amount". В случае, если на счету было, к примеру, 5'000.00 и нужно добавить еще 6'000.00, поле переполнится, и будет содержать значение 9'999.99 вместо 11'000.00, при этом выполнение запроса не вызывает ни ошибке, ни предупреждения. Хотя с т.з. безнес-логики приложения ошибка есть (теряется сумма на счете).
В голову приходит только явно определять максимально возможное значение поля, вычислять новое значение на стороне приложения, и если оно не превышает максимально допустимого, выполнять запрос на обновление.
Решение кажется кривоватым, т.к.
- целостность данных обеспечивается не за счет СУБД, а за счет приложения — при изменении макс. допустимого значения изменения придется вносить и в БД, и в конфигурацию приложения (ну или сделать так, чтобы приложение автоматически определяло это значение через дополнительный запрос);
- логика обновления значения (`field` = `field` + $amount) дублируется в проверке допустимости действия (получить новое значение, чтобы проверить, не переполнится ли поле, и непосредственно обновить значения поля) —_изменения в логике придется описывать в двух местах.
Может быть есть более грамотные решения?
Есть поле, содержащее сумму на счете пользователя, к примеру, DECIMAL(6,2). Добавление суммы на счет выполняется запросом вида "UPDATE `table` SET `field` = `field` + $amount". В случае, если на счету было, к примеру, 5'000.00 и нужно добавить еще 6'000.00, поле переполнится, и будет содержать значение 9'999.99 вместо 11'000.00, при этом выполнение запроса не вызывает ни ошибке, ни предупреждения. Хотя с т.з. безнес-логики приложения ошибка есть (теряется сумма на счете).
В голову приходит только явно определять максимально возможное значение поля, вычислять новое значение на стороне приложения, и если оно не превышает максимально допустимого, выполнять запрос на обновление.
Решение кажется кривоватым, т.к.
- целостность данных обеспечивается не за счет СУБД, а за счет приложения — при изменении макс. допустимого значения изменения придется вносить и в БД, и в конфигурацию приложения (ну или сделать так, чтобы приложение автоматически определяло это значение через дополнительный запрос);
- логика обновления значения (`field` = `field` + $amount) дублируется в проверке допустимости действия (получить новое значение, чтобы проверить, не переполнится ли поле, и непосредственно обновить значения поля) —_изменения в логике придется описывать в двух местах.
Может быть есть более грамотные решения?