Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Эксперименты с транзакциями
|
|||
|---|---|---|---|
|
#18+
Кассовая программа под Windows с локальной однопользовательской базой. Все таблицы INNODB. Среда разработки Delphi2007, для связи с базой используются компоненты MyDAC. Рабочий вариант, до начала экспериментов (транзакции не использовались от слова "совсем", все работало в режиме autocommit): 1. Запись заголовка чека: в TMyQuery подается запрос следующего вида с набором параметров: Код: sql 1. 2. 3. 2. Запись строк чека: полученный CheckId возвращается в приложение, далее через TMyCmd подается следующая команда с параметром :CheckId Код: sql 1. 3. Процедура расчета скидок, также отдельной командой через TMyCmd с параметром :CheckId Код: sql 1. 4. Процедура расчета доступных лимитов и переноса данных в промежуточные таблицы Код: sql 1. Тестовый вариант: Логика не изменилась, но до начала записи в базу формируется единый скрипт следующего вида, который передается в TMyQuery: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. В обоих случаях фиксирую в логах приложения время начала и окончания выполнения всей последовательности действий. Казалось бы, с использованием транзакций должно стать как минимум не хуже, но все вышло с точностью до наоборот. Если верить логам, в MySQL 5.6 единый скрипт выполняется в среднем на 30% дольше, чем последовательность из нескольких команд. Для эксперимента использовались два не самых слабых терминала 2Гб/2ГГц. В чем может быть причина? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2018, 10:42 |
|
||
|
Эксперименты с транзакциями
|
|||
|---|---|---|---|
|
#18+
A-MaRВ чем может быть причина?Наверное, в том, что на организацию транзакции тоже нужны некие ресурсы? А нахрена потребовалось всё это заворачивать в транзакцию? тем более явно без понимания сути - ибо настройки параметров транзакции не видать, и Вы про них ничего не говорите... Ну и - две строки Код: sql 1. 2. вполне можно заменить одной Код: sql 1. а поскольку переменная больше нигде не используется, так и просто Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2018, 11:08 |
|
||
|
Эксперименты с транзакциями
|
|||
|---|---|---|---|
|
#18+
AkinaА нахрена потребовалось всё это заворачивать в транзакцию? Такая мысль возникла в ходе тестирования под MySQL 8.0, так как в этой версии без использования транзакций все работает намного медленнее. Для остальных версий сервера я предусмотрел возможность отключения строк START TRANSACTION и COMMIT. Akinaибо настройки параметров транзакции не видать, и Вы про них ничего не говорите Если Вы про уровень изоляции, то устраивает REPEATABLE READ, используемый по умолчанию. Или есть еще какие-то настройки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2018, 12:00 |
|
||
|
Эксперименты с транзакциями
|
|||
|---|---|---|---|
|
#18+
A-MaRЕсли Вы про уровень изоляции, то устраивает REPEATABLE READ, используемый по умолчанию. Или есть еще какие-то настройки?Нет, именно о них. Вернее, о том, что не надо надеяться на что-то "по умолчанию", лучше всегда ставьте явно - во избежание сюрпризов, тем более что это дешёвая операция. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2018, 12:23 |
|
||
|
Эксперименты с транзакциями
|
|||
|---|---|---|---|
|
#18+
В общем, зря я грешил на транзакции - их отключение ничего не изменило. Зато тормоза исчезли после того как я: - избавился от переменной @CheckId, выделив получение этого идентификатора в отдельную операцию и подставляя во все остальные уже готовое значение в явном виде - везде, где не требуется возвращать значение, заменил TMyQuery на TMyCommand - указал явно уровень изоляции (Akina - благодарю за подсказку). Вроде как вопрос решен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2018, 10:43 |
|
||
|
Эксперименты с транзакциями
|
|||
|---|---|---|---|
|
#18+
Еще вопрос: если выполняется большой скрипт через командную строку с помощью команды mysql, и где-то между START TRANSACTION и COMMIT происходит ошибка - как правильно в этом случае откатить транзакцию? Если просто из приложения отправить ROLLBACK - не сработает, это же фактически уже другое соединение? Или я не прав? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2018, 18:44 |
|
||
|
Эксперименты с транзакциями
|
|||
|---|---|---|---|
|
#18+
A-MaRЕще вопрос: если выполняется большой скрипт через командную строку с помощью команды mysql, и где-то между START TRANSACTION и COMMIT происходит ошибка - как правильно в этом случае откатить транзакцию? Вопрос снимается, в случае MyDAC правильный ответ - юзать компонент TMyScript :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2018, 20:46 |
|
||
|
Эксперименты с транзакциями
|
|||
|---|---|---|---|
|
#18+
A-MaRкак правильно в этом случае откатить транзакцию?В скрипте должен быть определён обработчик ошибки (см. CREATE HANDLE). Именно там в случае ошибки и выполняется откат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2018, 07:26 |
|
||
|
Эксперименты с транзакциями
|
|||
|---|---|---|---|
|
#18+
AkinaВ скрипте должен быть определён обработчик ошибки (см. CREATE HANDLE). Именно там в случае ошибки и выполняется откат. Это если используются процедуры. А в моем случае в скрипте просто несколько мульти-insert-ов, сформированных динамически при парсинге текстового файла и обрамленных в транзакцию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2018, 07:53 |
|
||
|
Эксперименты с транзакциями
|
|||
|---|---|---|---|
|
#18+
Условная обработка возможна либо в процедуре, либо вручную. Анонимных блоков в MySQL нет... Конвертируйте в процедуру, типа Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2018, 08:43 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39641254&tid=1829860]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
41ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 137ms |

| 0 / 0 |
