Транзакции и параллелизм

Содержание

Слайд 2

Вопросы

Вопросы


Слайд 3

Понимание транзакций БД БД реализует понятие единицы работы, как транзакцию БД

Понимание транзакций БД

БД реализует понятие единицы работы, как транзакцию БД (иногда

называемую системная транзакция). Транзакции БД группируют операции доступа к данным. Транзакция гарантирует один из результатов работы: она или будет зафиксирована или откачена назад.  Следовательно,  транзакции БД действительно всегда атомарны.

Оплата билета

1. Проверка незанятости мест
2. Списание средств
3. Создание заказа
4. Создание билетов
5. Изменение состояния мест

Фиксирование
транзакции

Слайд 4

Понимание транзакций БД EntityManager em = HibernateUtil.getEntityManager(); Department economist = new

Понимание транзакций БД

EntityManager em = HibernateUtil.getEntityManager(); Department economist = new Department("Economist"); try {

em.getTransaction().begin(); em.persist(economist); // Other business logic stuff em.getTransaction().commit(); } catch (RollbackException e) { em.getTransaction().rollback(); } em.close();
Слайд 5

Проблемы изоляции транзакций • Потерянное обновление • Грязное чтение • Неповторяемое чтение • Фантомное чтение

Проблемы изоляции транзакций

•  Потерянное обновление •    Грязное чтение
•    Неповторяемое чтение

•    Фантомное чтение
Слайд 6

Установка уровня изоляции Значения для этой опции выглядят следующим образом (вы

Установка уровня изоляции

Значения для этой опции выглядят следующим образом (вы также

можете найти их, как константы в java.sql.Connection): •   0 – транзакции не поддерживаются;
•    1 – изоляция уровня чтения неподтвержденного; •    2 – изоляция уровня чтения подтвержденного; •    4 – изоляция уровня повторяемого чтения; •    8 – упорядоченная изоляция.
Слайд 7

Пессимистичная блокировка

Пессимистичная блокировка

Слайд 8

Нет блокировки EntityManager em = HibernateUtil.getEntityManager(); em.getTransaction().begin(); Cat cat = em.find(Cat.class,

Нет блокировки

EntityManager em = HibernateUtil.getEntityManager(); em.getTransaction().begin(); Cat cat = em.find(Cat.class, 1L); cat.setName("New"); em.getTransaction().commit(); em.close();

select catlockall0_.id as

id1_0_0_, catlockall0_.name as name2_0_0_
from CatLockAll catlockall0_ where catlockall0_.id=?
update CatLockAll set name=? where id=? and name=?
Слайд 9

Оптимистическая блокировка. Version EntityManager em = HibernateUtil.getEntityManager(); em.getTransaction().begin(); CatLockVersion cat =

Оптимистическая блокировка. Version

EntityManager em = HibernateUtil.getEntityManager(); em.getTransaction().begin(); CatLockVersion cat = em.find(CatLockVersion.class, 1L); cat.setName("New"); em.getTransaction().commit(); em.close();

Select id,

name, owner, version
from CatLockVersion where id=1
update CatLockVersion
set name= New, owner= Tim, version=1 where id=1 and version=0

@Data @AllArgsConstructor @NoArgsConstructor @Entity @OptimisticLocking(type = OptimisticLockType.VERSION) public class CatLockVersion { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String owner; @Version private Integer version; }

Слайд 10

Оптимистическая блокировка. All EntityManager em = HibernateUtil.getEntityManager(); em.getTransaction().begin(); CatLockAll cat =

Оптимистическая блокировка. All

EntityManager em = HibernateUtil.getEntityManager(); em.getTransaction().begin(); CatLockAll cat = em.find(CatLockAll.class, 1L); cat.setName("New"); em.getTransaction().commit(); em.close();

Select id,

name, owner
from CatLockAll where id=1
update CatLockAll
set name= New where id=1 and name=AllCat and owner=Tim

@Data @AllArgsConstructor @NoArgsConstructor @Entity @DynamicUpdate @OptimisticLocking(type = OptimisticLockType.ALL) public class CatLockAll { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String owner; }

Слайд 11

Оптимистическая блокировка. Dirty EntityManager em = HibernateUtil.getEntityManager(); em.getTransaction().begin(); CatLockDirty cat =

Оптимистическая блокировка. Dirty

EntityManager em = HibernateUtil.getEntityManager(); em.getTransaction().begin(); CatLockDirty cat = em.find(CatLockDirty.class, 1L); cat.setName("New"); em.getTransaction().commit(); em.close();

Select id,

name, owner
from CatLockDirty where id=1
update CatLockDirty
set name= New where where id=1 and name=Dirty

@Data @AllArgsConstructor @NoArgsConstructor @Entity @DynamicUpdate @SelectBeforeUpdate @OptimisticLocking(type = OptimisticLockType.DIRTY) public class CatLockDirty { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String owner; }

Слайд 12

Оптимистическая блокировка EntityManager em = HibernateUtil.getEntityManager(); em.getTransaction().begin(); CatLockVersion cat = em.find(CatLockVersion.class,

Оптимистическая блокировка

EntityManager em = HibernateUtil.getEntityManager(); em.getTransaction().begin(); CatLockVersion cat = em.find(CatLockVersion.class, 1L, LockModeType.OPTIMISTIC); cat.setName("New"); em.getTransaction().commit(); em.close();

select id,

name, owner, version
from CatLockVersion where id=1
update CatLockVersion set name=New, owner=Tim, version=1 where id=1 and version=0
select version from CatLockVersion where id =1
Слайд 13

Оптимистическая блокировка с ошибкой select id , name, owner, version from

Оптимистическая блокировка с ошибкой

select id , name, owner, version from CatLockVersion

where id=1
select id , name, owner, version from CatLockVersion where id=1
update CatLockVersion set name= Updated Cat, owner= Tim, version=1 where id=1 and version=0
update CatLockVersion set name= New, owner= Tim, version=1 where id=1 and version=0
HHH000346: Error during managed flush [Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1]

EntityManager em = HibernateUtil.getEntityManager(); em.getTransaction().begin(); CatLockVersion cat = em.find(CatLockVersion.class, 1L, LockModeType.OPTIMISTIC); cat.setName("New"); new Thread(()-> { EntityManager entityManager = HibernateUtil.getEntityManager(); entityManager.getTransaction().begin(); CatLockVersion updatedCat = entityManager.find(CatLockVersion.class, 1L); updatedCat.setName("Updated Cat"); entityManager.getTransaction().commit(); }).start(); Thread.sleep(500); em.getTransaction().commit();

Слайд 14

Оптимистическая блокировка c инкрементом версии EntityManager em = HibernateUtil.getEntityManager(); em.getTransaction().begin(); CatLockVersion

Оптимистическая блокировка c инкрементом версии

EntityManager em = HibernateUtil.getEntityManager(); em.getTransaction().begin(); CatLockVersion cat = em.find(CatLockVersion.class,

1L, LockModeType.OPTIMISTIC_FORCE_INCREMENT); cat.setName("New"); em.getTransaction().commit(); em.close();

select id, name, owner, version
from CatLockVersion where id=1
update CatLockVersion set version=1 where id=1 and version=0

Слайд 15

Пессимистическая блокировка select id , name, owner, version from Cat where

Пессимистическая блокировка

select id , name, owner, version from Cat where id=1

for update
select id , name, owner, version from Cat where id=1
update CatLockVersion set name= Updated Cat, owner= Tim, version=1 where id=1 and version=0
update CatLockVersion set name= New, owner= Tim, version=1 where id=1 and version=0
select id , name, owner, version from Cat where id=1
Cat(id=1, name=Updated Cat, owner=Tim)

EntityManager em = HibernateUtil.getEntityManager(); em.getTransaction().begin(); Cat cat = em.find(Cat.class, 1L, LockModeType.PESSIMISTIC_WRITE); cat.setName("New"); new Thread(()-> { EntityManager entityManager = HibernateUtil.getEntityManager(); entityManager.getTransaction().begin(); Cat updatedCat = entityManager.find(Cat.class, 1L); updatedCat.setName("Updated Cat"); entityManager.getTransaction().commit(); }).start(); Thread.sleep(500); em.getTransaction().commit(); em.clear();

Слайд 16

Вопросы

Вопросы


Слайд 17

Кэш второго уровня Hibernate

Кэш второго уровня Hibernate

Слайд 18

Стратеги кэширования и области Транзакционный – связанный с текущей единицей работы,

Стратеги кэширования и области

Транзакционный – связанный с текущей единицей работы, которая может

быть фактическая транзакция БД или транзакция приложения. Она корректна и используется во время работы единицы работы. Каждая единица работы имеет свой кэш.
Процессный – распределяется между многими (возможно одновременными) единицами работы или транзакции. Это означает, что данные в процессном КЭШе доступны одновременно выполняемым операциям, очевидно с последствиями для изоляции транзакций. Процессный кэш может хранить хранимые объекты целиком в КЭШе, или может хранить их состояние в разобранном формате.
Кластерный – распределяется между несколькими процессами на одной машине или между несколькими машинами в кластере
Слайд 19

Стратеги кэширования и области

Стратеги кэширования и области

Слайд 20

Архитектура КЭШа в Hibernate

Архитектура КЭШа в Hibernate

Слайд 21

Кэш второго уровня Hibernate Политика КЭШа включает в себя настройку следующих

Кэш второго уровня Hibernate

Политика КЭШа включает в себя настройку следующих параметров:
 Включен

ли кэш второго уровня
Стратегию параллелизма Hibernate
 Политика истекания срока кэширования (такую, как тайм-аут, LRU, зависимую от ОП)
 Физическое устройство КЭШа (в памяти, индексируемые файлы, кластерная репликация)
Слайд 22

Встроенные стратегии параллелизма Есть четыре встроенных стратегии параллелизма, представляющие снижение уровня

 Встроенные стратегии параллелизма

Есть четыре встроенных стратегии параллелизма, представляющие снижение уровня строгости,

в терминах изолированности транзакции:
Транзакционная – доступна только в управляемой среде. Она гарантирует полную изоляцию транзакций до повторяемого чтения, если это требуется. Используйте эту стратегию для данных которых в большинстве считываются, в которых очень важно предотвратить появление устаревших данных в параллельных транзакциях, в редких случаях обновления.
Чтение-запись – поддерживает изоляцию чтения подтвержденного, используя механизм временных меток. Она доступна только в некластерных средах.
Нестрогое-чтение-запись -  не дает никакой гарантии согласованности между КЭШем и БД. Если есть возможность одновременного доступа к одной сущности, то вам необходимо настроить достаточно короткий срок истечения тайм-аута. 
Только-для-чтения – данная стратегия подходит для данных, которые никогда не меняются. Используйте её только для справочных данных.
Слайд 23

Выбор поставщика КЭШа Следующие поставщики встроены в Hibernate: EHCache предназначен для

Выбор поставщика КЭШа

Следующие поставщики встроены в Hibernate:
EHCache предназначен для процессного и

кластерного кэширования в одной JVM. Он может кэшировать в памяти или на диске и поддерживает опциональный Hibernate кэш результатов запроса.
Infinispan – это полностью транзакционно-репликационный кластеризованный кэш с поддержкой КЭШа запросов, предполагая, что часы в кластере синхронизированы.
SwarmCache – это кластерный кэш, основанный на JGroups. Он использует кластерное аннулирование, но не поддерживает кэш Hibernate запросов.
JCache – это полностью транзакционно-репликационный кластеризованный кэш, также основанных на JGroups. Кэш запросов Hibernate поддерживается, предполагая, что часы в кластере синхронизированы.
Слайд 24

org.hibernate.jpa.HibernatePersistenceProvider by.it.entity.Department by.it.entity.Employee by.it.entity.EmployeeDetail by.it.entity.Meeting true Hibernate кэширование на практике

org.hibernate.jpa.HibernatePersistenceProvider by.it.entity.Department

by.it.entity.Employee by.it.entity.EmployeeDetail by.it.entity.Meeting true

Hibernate кэширование на практике

Слайд 25

Hibernate кэширование на практике

Hibernate кэширование на практике

Слайд 26

Hibernate кэширование на практике

Hibernate кэширование на практике

memoryStoreEvictionPolicy="LRU"/>
Слайд 27

Hibernate кэширование на практике

Hibernate кэширование на практике

Слайд 28

Hibernate кэширование на практике

Hibernate кэширование на практике

Слайд 29

Hibernate кэширование на практике

Hibernate кэширование на практике

Слайд 30

Вопросы

Вопросы