Просто столкнулся с неясным случаем этого. Наш код читает список записей из базы данных, изменяет столбец и записывает их по очереди. Предложение UPDATE
WHERE
содержит только два условия: WHERE key=? AND last_update_dt=?
. (Проверка временной метки предназначена для оптимистической блокировки: если запись изменяется другим процессом до того, как мы напишем нашу, обновляется 0 строк, и мы выдаем ошибку.)
Но для одной конкретной строки UPDATE
не удался - было получено ноль строк.
После долгих выдергиваний я заметил, что отметка времени для строки была 2019-03-10 02:59
. В большей части США эта временная метка не существует - переход на летнее время приводит к тому, что время пропускается напрямую с 2:00 до 3:00. Поэтому я догадался, что во время прохождения туда-обратно из MySQL в Java обратно в MySQL некоторая часть кода интерпретировала эту временную метку иначе, чем остальные, в результате чего временные метки в предложении WHERE
не совпадали.
Изменение метки времени строки на один час позволило избежать этой проблемы.
(Конечно, исправление правильное отменяет переход на летнее время. Я создал Jira, но правительство США еще не ответило на него.)