• Замечательная аннотация Version в JPA

    Введение


    Итак, начнем! Что же означает аннотация Version в JPA?

    Если коротко, то она отвечает за блокировки в JPA. Данная аннотация решает одну из проблем, которые могут возникнуть в результате параллельного выполнения транзакций.

    Какие же могут возникнуть проблемы?


    1. Потерянные обновления могут возникнуть в ситуациях, когда две транзакции, выполняющиеся параллельно, пытаются обновить одни и те же данные.
    2. Грязные чтения возникают, когда транзакция видит еще не сохранённые изменения, сделанные другой транзакцией. В таких случая может возникнуть проблема из-за отката второй транзакции, но при этом данные уже были прочитаны первой.
    3. Неповторяемые чтения возникают, когда первая транзакция получила данные, а вторая транзакция внесла в них изменение и успешно закоммитила их, до окончания первой транзакции. Иначе говоря, когда в рамках одной транзакции один и тот же запрос на получение, например всей таблицы, возвращает разные результаты.
    4. Фантомное чтение — проблема похожая на неповторяемые чтения, за тем исключением, что возвращается разное количество строк.

    Коротко о их решениях


    1. READ UNCOMMITED — решается с помощью аннотации Version в JPA(об этом как раз и статья)
    2. READ COMMITED — позволяет читать только закоммиченные изменения
    3. REPEATABLE READ — тут немного посложнее. Наша транзакция «не видит» изменения данных, которые были ею ранее прочитаны, а другие транзакции не могут изменять тех данных, что попали в нашу транзакцию.
    4. SERIALIZABLE — последовательное выполнение транзакций

    Каждый последующий пункт покрывает все предыдущие, иначе говоря может заменить решения, указанные ранее. Таким образом SERIALIZABLE имеет самый высокий уровень изолированности, а READ UNCOMMITED — самый низкий.
    Читать дальше →
  • Реализация стейтмашины на Zend Framework3+Doctine2

    Введение: зачем нужна стейтмашина


    В приложениях часто необходимо ограничивать доступ к тем или иным действиям над объектом. Для этого используют RBAC-модули, которые решают задачу ограничения доступа в зависимости от прав пользователя. Остается нерешенной задача управления действиями в зависимости от состояния объекта. Эта задача хорошо решается с помощью конечного автомата или state machine. Удобная стейтмашина позволяет не только собрать в одном месте все правила переходов между состояниями объекта, но и наводит некоторый порядок в коде отделяя правила переходов, проверки условия и обрабочкики и подчиняя их общим правилам.


    Хочу поделиться реализацией стейтмашины под Zend Framework 3 с использованием Doctrine 2
    для работы с базой данных. Сам проект можно найти по ссылке.


    А здесь я хочу поделиться основными заложенными принципами.

    Читать дальше →
  • Использование событийной модели в Doctrine 2 + Symfony 3

      Давайте представим ситуацию: у вас есть заказ в интернет магазине (Entity). Заказ имеет некий статус. При смене статуса заказа необходимо провести кучу сопутствующих действий, например:


      • сохранить в заказе дату последнего изменения
      • записать в историю по заказу информацию о смене статуса
      • отослать письмо / sms клиенту
      • вызвать метод API службы доставки / платежной системы / партнера и т.д.

      Возникает вопрос как все это правильно организовать с точки зрения программного кода.
      Все ниже описанное справедливо для Doctrine 2 и Symfony > 3.1

      Читать дальше →
    • DDD на практике. Проектирование списка желаний

      • Tutorial

      В интернете довольно много разрозненного материала по DDD. Если не считать синей книги, то в основном это короткие статьи с теорией, надёрганной из этой же книги, и которая мало пересекается с практикой. Возможно, конечно, что я просто плохо искал, но мне давно хотелось найти какой-нибудь цельный пример, что называется, «от и до». И я решил такой пример создать на Symfony 3 и VueJS. Сразу хочу сказать, что я изучаю DDD недавно, поэтому взял довольно простую предметную область — список желаний (wish list).

      Читать дальше →
    • Джентльменский набор Doctrine 2 для Symfony 3.3.6: Создание сущности, ассоциации и рекурсивные связи

      • Tutorial


      Доброго дня, читатель!

      Что мы будем делать с вами по ходу чтения статьи


      • Создадим простые сущности
      • Немного поговорим об ORM аннотациях
      • Реализуем ассоциации:
        1. Двунаправленные связи Один к Одному
        2. Двунаправленные связи Один ко Многим
        3. Двунаправленные связи Многие ко Многим
        4. Рекурсивные связи

      • Поиграемся этими сущностями с помощью фикстур

      Читать дальше →
    • Doctrine Specification Pattern или ваш реюзабельный QueryBuilder

      • Tutorial
      Я постараюсь максимально коротко рассказать о том, как можно использовать этот паттерн с нашей любимой Doctrine на примерах и почему так делать — true.

      Давайте представим себе базовый кейс:

      1. У нас есть: сущность «Дом», сущность «Квартира в доме», сущность «Застройщик», сущность «Регион».
      2. У нас есть задача: иметь возможность получить всех застройщиков, иметь возможность получить все занятые регионы застройщиком, уметь возможность получить все дома, которые принадлежат застройщику и все доступные регионы вообще в принципе, где ведутся продажи домов.
      3. У нас есть правила от бизнеса:
      Читать дальше →
    • ЧПУ (SEF URLs) в Symfony 3 — автогенерация slug, настройка и маршрутизация

      • Tutorial
      Всем доброго времени суток!

      Третьего дня мне понадобилось провести блиц вебинар на тему ЧПУ в Symfony. Вообще время вебинара у меня ограничено двумя часами, при этом я должен был рассказать еще и про автогенерацию CRUD функционала (scaffolding) в той же Symfony, и про простейший способ создать постраничность. Это создало проблему, так как я знаю как сделать ЧПУ «ручками», не прибегая к автоматизированным под эту задачу инструментам, но рассказ получился бы долгий и оказались бы затянутыми в обсуждение лишние темы. Поэтому я пошел спрашивать у Интернета как сделать все проще. И вот я оказался в той редкой ситуации, когда такая популярная платформа как Symfony не имеет банального обучающего материала на тему «ЧПУ в три клика». Смотрел так же и на английском языке, но там тоже пусто (может плохо искал — время было ограничено). В общем я справился с поиском разрозненного материала по данной теме, а так же со сбором его в единое повествование, так что почему бы не поделиться со всеми?


      Читать дальше →
    • ORM на php для MySQL, реальность (часть первая)

      После долгих поисков интересующей меня библиотеки на php для связи с MySQL сел и написал свою, наиболее подходящую для использования в проектах. Данная тема займет небольшой цикл статей, который будет полезен не только профессиональным разработчикам веб-приложений, но и начинающим. Следует отметить, что представленная ниже ORM библиотека, которую, кстати, я назвал kitty, является результатом долгих мучений и не является обязательной библиотекой всех проектов.

      Библиотека по моему видению должна иметь два файла (по крайней мере на начальных этапах):
      • файл библиотеки — kitty.php;
      • файл объектного изображения модели базы данных — modeldb.php.

      Читать дальше →

    Самое читаемое