Many thanks to Tristan Morris for creating a beautiful illustrated hardcover print edition of the site

tcc-case-title

Однажды ночью монахиня Гвида была вызвана мастером Баваном

“Любопытные вещи происходят с нашей страницей смены адреса” - сказал Баван. “Пользователи заполняют форму и нажимают ‘сохранить’. Ошибок не отображается, и в логах ошибок так же не видно. Браузер переходит на страницу профиля пользователя, как и должно быть. Однако, эта страница иногда отображает значение старого адреса вместо нового.”

“Скорее всего, пропущенное исключение” - ответила Гвида, желая находиться сейчас совсем в другом месте.

“Это ещё не всё” - сказал мастер, качая головой в отрицание. “Если затем перезагрузить страницу с профилем, то в ней иногда отображается старый адрес, а иногда новый. Рисунок такого поведения для нас размыт”

“Тогда проблема кеширования” - предположила монахиня.

“И это ещё не всё” - сказал мастер. “Спустя несколько минут, один из этих адресов будет отображаться вечно. Но опять же, иногда новый, иногда - старый.”

“Ну, тогда не знаю” - выдохнула Гвида. “Видимо проклятие или злой дух” Баван щёлкнул монахиню по лбу и удаляясь, сказал: - “Я не терплю сельских предрассудков, монахиня. Здесь нет места магии. Единственный злой дух ты увидишь здесь завтра утром, если окажется что на избранника Банзена нельзя полагаться”

- - -

Монахиня открыла злосчастную страницу. Проблема подтверждалась - всё как описывал мастер.

“Любопытнее всего...”, - говорила Гвида в монитор, - “...что твоё лицо иногда говорит одно, а иногда другое. Но что таит твоё сердце, хотела бы я знать?”

Монахиня залогинилась в базу, сверяя запись таблицы каждый раз при сохранении изменений. Но то,что обнаружилось, было бессмысленным: хоть страница и отображала то новый, то старый адрес, запись в базе всегда содержала старый адрес. Но спустя несколько минут и страница и запись в базе имели одинаковые значения нового или старого адреса.

“Здесь нет магии”, - повторила Гвида. “Любое, даже самое загадочное поведение, имеет рациональное объяснение.”

- - -

“...И всё же я не имею ни малейшего представления чем это объяснимо”, - плакалась Гвида свой соседке Йивен. - “Единственное подозрение - некорректный коммит транзакции, из-за чего изменения не видны из другой сессии к базе”

“Тысяча пардонов”, - зевнула из подушки Йивен сонно щурясь на фонарь Гвиды, - “Но моё единственное подозрение в том, что я ещё минуту назад имела крылья и летала в сладком сне, судя по тому, что часы показывают за час ночи. Неужели никого другого нет для консультаций?”

“Двор пуст, как и мой мозг”, - ответила Гвида. “Помоги мне думать! Контроллер вызывает Сервис-метод чтобы сохранить адрес. Метод объявлен транзакционным. Метод вызывается, но в результате - каша. Почему?”

“Я ничего не знаю о транзакциях,” - сказала Йивен, падая обратно в подушку. - “я только знаю об использовании аннотаций там где им место. Всё остальное - магия”

“Нет никакой магии”, сказала рассеянно Гвида. Вдруг, она молнией вылетела из кельи...

- - -

“Когда сервис-метод коммитит транзакцию?” - спросила Гвида широко улыбаясь.

“В 04:30 утра?” - раздражённо переспросил мастер Баван.

“/Никогда/” - сказала монахиня. - “этим занимается проксирующий объект, который декорирует сервисный. И когда проксирующий объект не делает то что требуется?”

“Очередной вопрос с подвохом?” - спросил Баван.

“Когда он не используется!” триумфально провогласила Гвида. “Ошибка конфигурации приложения привела к тому, что Контроллер инжектится с сервисным объектом вместо его прокси.”

“Интересно” - ответил Баван. “А что на счёт страницы, отображающей то новую, то старую запись?”

“А поскольку транзакции нет” - отвечала Гвида, - “...обновление записи в базе производится без коммита, используя коннект из общего пулла. Если повезло, и странице достался тот же коннект, отобразится новая запись, иначе - старая.”

“Занятно” - ответил мастер. - “И такое поведение через какое-то время вымирает, потому что...?”

“Если этот коннект был занят другой транзакцией в какой-либо иной части приложения, то тогда произойдёт либо коммит либо откат этой транзакции” - продолжила Гвида. “И если она остаётся невостребованной определенное время, мы откатываем её и закрываем.”

“Превосходно,” - сказал мастер. “Без злых духов. И магии. Ступай, поспи.”

- - -

Гвида прокралась в свою постель чтобы не разбудить Йивен. Однако сон ещё долго не мог пробиться сквозь шторм её мыслей. Йивен лежала на сложенных руках направив взор в темноту.

Что есть магия, задавалсь вопросом Йивен, как не воплощение вещей скрытыми средствами? Разве ловкий жонглёр не менее достоин звания мага, чем повелитель духов? Разве не является, возможно, наивысшым удовольствием подсмотреть происходящее за кулисами, открыть тайну загадочного механизма с обратной стороны фасада, и осознать что с таким опытом достаётся истинная сила?

Гвида ещё впитывала полученный опыт, будучи уже в глубоком сне, без шанса быть потревоженной кипящей жизнью Храма - звуками стартующих машин, водой в трубах, шумом людей, гонгами к началу завтрака и медитации, к началу нового дня, как и любого другого дня в этом дивном месте чудес.