Главная страница
Навигация по странице:

  • ACID

  • всё либо ничего

  • I — Isolation — изолированность

  • D — Durability — надежность

  • @Transactional

  • Состояния объектов

  • Транзакции. Транзакция. 1zqCtmxazSwf1 qyi токен GitLab Транзакция


    Скачать 18.48 Kb.
    Название1zqCtmxazSwf1 qyi токен GitLab Транзакция
    АнкорТранзакции
    Дата20.03.2022
    Размер18.48 Kb.
    Формат файлаdocx
    Имя файлаТранзакция.docx
    ТипДокументы
    #405619

    -1zq-CtmxazSwf1-_qyi токен GitLab

    Транзакция — это группа последовательных операций с базой данных, которая представляет собой логическую единицу работы с данными.

    Транзакция может быть выполнена либо целиком и успешно, соблюдая целостность данных и независимо от параллельно идущих других транзакций, либо не выполнена вообще, и тогда она не оказывает никакого эффекта

    У транзакций есть четыре основные свойства, которые сокращенно называют ACID.

    ACID - Atomicity , consistency , isolation , durability. Атомарность, согласованность, изолированность, надежность.

    A — Atomicity — атомарностьданное свойство гарантирует, что никакая транзакция не будет зафиксирована в системе частично. Будут либо выполнены все её подоперации, либо не выполнено ни одной (всё либо ничего).

    С — Consistency — согласованность — свойство, гарантирующее, что каждая успешная транзакция зафиксирует только допустимые результаты. То есть, это гарантия того, что при успешной транзакции будут выполнены все правила, ограничения которые предъявляет система к конкретным данным, иначе транзакция не будет выполнена и данные в системе вернутся к прежнему состоянию.

    I — Isolation — изолированность — свойство, которое говорит о том, что во время выполнения транзакции параллельные транзакции не должны оказывать влияния на ее результат. Это свойство ресурсозатратно, поэтому как правило оно выполняется частично, допуская определенные уровни изоляций, которые решают определенные изоляционные проблемы. Подробнее мы это обсудим в следующем вопросе.

    D — Durability — надежность — данное свойство гарантирует, что если пользователь получил подтверждение от системы, что транзакция выполнена, он может быть уверен, что сделанные им изменения не отменятся из-за какого-либо сбоя. То есть, вы можете быть уверены, что какой-нибудь сбой операционной системы ничего не сделает с вашими данными, если вы уже получили подтверждение успешного выполнения вашей транзакции.

    @Transactional

    Аннотация @Transactional поддерживает несколько параметров, которые задают поведение транзакции:

    • value и transactionManager — указывают, какой именно экземпляр PlatformTransactionManager использовать, если их несколько.

    • readOnly — указывает, что транзакция только читает данные, но не изменяет их. Это может быть использовано для оптимизации запросов или блокировок на уровне базы.

    • timeout — задаёт максимальную длительность операции на стороне базы данных и если эта длительность будет превышена, метод прервётся и транзакция откатится

    • rollbackForrollbackForClassName — задают список классов исключений, которые вызовут откат транзакции, если метод их выбросит. В коде выше метод updateGreet() именно так откатывает транзакцию. По умолчанию, каждое исключение, имеющее в предках RuntimeError, вызывает откат транзакции.

    • noRollbackFornoRollbackForClassName — задают список классов исключений, которые не вызовут откат транзакции, если метод их выбросит.

    • propagation и isolation — управляют распространением транзакции и её уровнем изоляции. Я опишу эти параметры в отдельной статье.

    В кратце метод с @Transactional можно рассматривать так: при входе в метод автоматически создаётся транзакция и открывается соединение с базой данных или создаётся persistence context. При выходе из функции транзакция автоматически подтверждается. Если функция кидает RuntimeError или его наследника (или настроенное исключение), транзакция автоматически откатывается. В любом случае, после выхода из метода соединение с базой закрывается, а persistence context разрушается.

    Состояния объектов


    Объект-сущность может находиться в одном из 3-х состояний (статусов):

    • transient object (переходной)— объект-сущность была только инициализирована, но пока ещё не добавлена под управление ORM, не имеет представления в базе данных, ключевые поля, как правило, ещё не заданы.Поле Id не должно быть заполнено, иначе объект имеет статус detached;

    • persistent object (постоянный)— объект в данном статусе — так называемая хранимая сущность, которая присоединена к конкретной сессии. Только в этом статусе объект взаимодействует с базой данных. При работе с объектом данного типа в рамках транзакции все изменения объекта записываются в базу;

    • detached object (отдельный)— объект в данном статусе — это объект, отсоединённый от сессии, может существовать или не существовать в БД.

    Любой объект-сущность можно переводить из одного статуса в другой. Для этого в интерфейсе Session существуют следующие методы:

    • persist(Object) — преобразует объект из transient в persistent, то есть присоединяет к сессии и сохраняет в БД. Однако, если мы присвоим значение полю Id объекта, то получим PersistentObjectException — Hibernate посчитает, что объект detached, т. е. существует в БД. При сохранении метод persist() сразу выполняет INSERT, не делая SELECT.

    • merge(Object) — преобразует объект из transient или detached в persistent. Если из transient, то работает аналогично persist()(генерирует для объекта новый Id, даже если он задан), если из detached — загружает объект из БД, присоединяет к сессии, а при сохранении выполняет запрос update

    • replicate(Object, ReplicationMode) — преобразует объект из detached в persistent, при этом у объекта обязательно должен быть заранее установлен Id. Данный метод предназначен для сохранения в БД объекта с заданным Id, чего не позволяют сделать persist() и merge(). Если объект с данным Id уже существует в БД, то поведение определяется согласно правилу из перечисления org.hibernate.ReplicationMode:
      — ReplicationMode.IGNORE — ничего не меняется в базе.
      — ReplicationMode.OVERWRITE — объект сохраняется в базу вместо существующего.
      — ReplicationMode.LATEST_VERSION — в базе сохраняется объект с последней версией.
      — ReplicationMode.EXCEPTION — генерирует исключение.

    • delete(Object) — удаляет объект из БД, иными словами, преобразует persistent в transientObject может быть в любом статусе, главное, чтобы был установлен Id.

    • save(Object) — сохраняет объект в БД, генерируя новый Id, даже если он установлен. Object может быть в статусе transient или detached

    • update(Object) — обновляет объект в БД, преобразуя его в persistent (Object в статусе detached)

    • saveOrUpdate(Object) — вызывает save() или update()

    • refresh(Object) — обновляет detached-объект, выполнив select к БД, и преобразует его в persistent

    • get(Object.class, id) — получает из БД объект класса-сущности с определённым Id в статусе persistent


    написать администратору сайта