Evgeniy Krivosheev Vyacheslav Yakovenko Last update: Feb, 2012 Spring Framework Module 7 – Transactions.

Презентация:



Advertisements
Похожие презентации
Evgeniy Krivosheev Last update: March, 2012 Spring Framework Module 10 – JMS, EJB.
Advertisements

Транзакции Транзакция - это последовательность операций, производимых над базой данных и переводящих базу данных из одного непротиворечивого (согласованного)
Модуль 4 Рассматриваемые темы: Понятие транзакции Конкурентный доступ к данным Использование транзакций в JDBC API Транзакции в JDBC API слайд 4-1.
Лекция 25 Лекция 25 Понятие целостности базы данных. Условия целостности. Транзакции. Обработка транзакций. Свойства транзакций. Модель ANSI/ISO. Назначение.
Модели транзакций Свойства транзакций. Способы завершения транзакций.
Java Database Connectivity (JDBC) Универсальное API для доступа к данным.
Evgeniy Krivosheev Vyacheslav Yakovenko Last update: Feb, 2012 Spring Framework Module 4 – JNDI.
Транзакции Транзакция (transaction) – набор логически связанных действий, выполняемых как единая операция Транзакция – это логическая единица работы.
Выполнила студентка группы ТУ-501 Полозова Ю.О. База данных (БД) представляет собой совокупность структурированных данных, хранимых в памяти вычислительной.
Evgeniy Krivosheev Vyacheslav Yakovenko Last update: Feb, 2012 Spring Framework Module 4 – DAO, JDBC.
Рассматриваемые темы EJB Timer сервис Создание таймера Отмена и сохранение таймера Получение информации о таймере Транзакции и таймеры 11-1.
ACID – свойства транзакций 1.Атомарность 2.Согласованность 3.Изолированность 4.Долговечность create table AccountInfo(Name varchar2(100), Account number(10));
Исключения в EJB Кряжев Василий
Лекция 26 Лекция 26 Параллельное выполнение транзакций. Типы конфликтов. Захваты и блокировки.
Модели транзакций Параллельное выполнение транзакций.
Saint Petersburg, 2011 Java Lecture #A01 JDBC. Транзакции ACID: Atomicity, Consistency, Isolation, Durability Atomicity: в контексте транзакции либо выполняются.
Система контроля прав доступа При помощи процедур и триггеров в MySQL.
Рассматриваемые темы Введение в кластеринг Кластеринг Stateless session beans Кластеринг Stateful session beans Конфигурация кластеринга 2-1.
Модели транзакций Журнализация и буферизация. Зачем нужна буферизация Если бы запись об изменении базы данных, которая должна поступить в журнал при выполнении.
Определение 2www.timurshamiladze.ru Уровень изоляции транзакции - набор правил, которые определяют насколько сильно необходимо.
Транксрипт:

Evgeniy Krivosheev Vyacheslav Yakovenko Last update: Feb, 2012 Spring Framework Module 7 – Transactions

2 Содержание ACID Типы транзакций Обзор API Уровни изоляции Распространение транзакции между вызовами (Propagation) Использование AOP для управления транзакциями Программное управление транзакциями Примеры Упражнения

3 Spring :: Tx :: ACID Транзакция –последовательность операций, которые удовлетворяют свойствам ACID: Atomicity (Атомарность) - выполняются или все операции, или ни одной; Consistence (Согласованность) - после завершения транзакции (успешного или нет) данные остаются в непротиворечивом состоянии; Isolation (Изолированность) - транзакции позволяют нескольким пользователям одновременно работать с одними и теми же данными; Durability (Надежность) - как только транзакция завершилась, результат транзакции должен быть сохранен.

4 Spring :: Tx :: Транзакция Перевод Х рублей со счета А на счет В А = А-Х B=B+X Начало транзакции Подтверждение транзакции Целостное состояние БД BEGIN COMMIT Прочитать А Вычесть Х из А Сохранить А А блокируется для записи или для чтения и записи до конца транзакции

5 Spring :: Tx :: ACID Перевод Х рублей со счета А на счет В А = А-Х B=B+X Начало транзакции Подтверждение транзакции Откат транзакции Откат транзакции Целостное состояние БД Недостаточно средств? Счет заблокирован? BEGIN COMMITROLLBACK

6 Spring :: Tx :: ACID Перевод Х рублей со счета А на счет В А = А-Х B=B+X Начало транзакции Подтверждение транзакции Целостное состояние БД А = А-Y Начало транзакции Блокирование транзакции до завершения предыдущей транзакции

7 Spring :: Tx :: Типы транзакций Локальные – транзакции в одном источнике данных; прикладная программа обращается только к одной СУБД и сама определяет, когда закреплять или откатывать транзакцию Глобальные (распределенные) – транзакции, охватывающие несколько источников данных управляются сервером приложений с использованием JTA (Java Transaction API);

8 диспетчер транзакций Spring :: Tx :: Распределенные транзакции Перевод Х рублей со счета А в одном банке на счет В в другом А = А-Х B=B+X Начало транзакции Начало транзакции Транзакция подготовлена Транзакция подготовлена Фиксация транзакции Транзакция подготовлена Транзакция подготовлена Откат транзакции Откат транзакции Начало транзакции Начало транзакции COMMIT PREPARED COMMIT PREPARED ROLLBACK PREPARED

9 Spring :: Tx Модель поддержки транзакций, используемая в Spring Framework, подходит для разных транзакционных API (JDBC, Hibernate, JPA, JDO, etc.) Преимущества: НЕ нужен сервер приложений; Декларативное управление транзакциями.

10 Spring :: Tx API Основная абстракция для работы с транзакциями в Spring, определяется интерфейсом: org.springframework.transaction.PlatformTransactionManager public interface PlatformTransactionManager { // создание транзакции по definition TransactionStatus getTransaction (TransactionDefinition definition) throws TransactionException; void commit(TransactionStatus status) throws TransactionException; void rollback(TransactionStatus status) throws TransactionException; } Наиболее востребованные имплементации: DataSourceTransactionManager ; HibernateTransactionManager ; JmsTransactionManager ; JmsTransactionManager102 ; JpaTransactionManager ; OC4JJtaTransactionManager ; WebLogicJtaTransactionManager ; WebSphereUowTransactionManager это интерфейс – для него легко можно сделать mock или stub, что позволяет упростить тестирование; не завязан на JNDI, определяется в Spring IoC контейнере

11 Spring :: Tx API В качестве интерфейса, для задания и получения свойств конкретной транзакции используется интерфейс: org.springframework.transaction.TransactionDefinition Параметры TransactionDefinition: Isolation – уровень изоляции транзакций ; Propagation – распространение транзакции: как передаются транзакции от метода к методу ; Timeout ; Read-only status ;

12 Spring :: Tx API В случае декларативного объявления транзакций, TransactionDefinition создается опосредованно через = true) public class DefaultFooService implements FooService { public Foo getFoo(String fooName) { // do something = false, propagation = Propagation.REQUIRES_NEW) public void updateFoo(Foo foo) { // do something }

13 Spring :: Tx API Однако, для того чтобы приложение смогло работать с транзакциями в декларативной манере, в контексте приложения необходимо добавить декларацию: И внедрить один или более бинов – менеджеров транзакций:

14 Spring :: Tx API Рассмотрим параметры TransactionDefinition подробнее Isolation – уровень изоляции транзакций ; Propagation – распространение транзакции: как передаются транзакции от метода к методу ; Timeout ; Read-only status ;

15 Уровень изоляции Фантомное чтение Неповторя ющееся чтение «Грязное» чтение Потерянное обновление ISOLATION_READ_UNCOMMITTED READ UNCOMMITTED –––+ ISOLATION_READ_COMMITTED READ COMMITTED ––++ ISOLATION_REPEATABLE_READ REPEATABLE READ –+++ ISOLATION_SERIALIZABLE SERIALIZABLE++++ Spring :: Tx :: Уровни изоляции

16 Spring :: Tx :: Грязное чтение Перевод Х рублей со счета А на счет В А = А-Х B=B+X Начало транзакции Подтверждение транзакции Целостное состояние БД Чтение A и B Начало транзакции Со счета А уже сняты деньги, на счет B деньги еще не пришли – мы имеем «грязные» данные.

17 Spring :: Tx :: Грязное чтение Перевод Х рублей со счета А на счет В А = А-Х B=B+X Начало транзакции Подтверждение транзакции Целостное состояние БД Чтение A и B Начало транзакции Сколько всего денег у клиента (А+B)? Денег мало! Не хватит на текущие расходы! Клиент – банкрот!

18 Spring :: Tx :: Неповторяющееся чтение Снятие денег со счета А двумя параллельными транзакциями На счете A достаточно средств? ДА! А=А-X Начало транзакции Целостное состояние БД A = A-Y Начало транзакции Со счета А уже сняты деньги, на счет B деньги еще не пришли – мы имеем «грязные» данные. Подтверждение транзакции A<0! Денег нет! Откат транзакции A<0! Денег нет! Откат транзакции

19 Spring :: Tx :: Фантомное чтение За время транзакции 2 в таблице БАЛАНС появились новые данные, отвечающие условию выборки. Начало транзакции 1 Сколько всего денег у клиента? A+B=-1000 руб. Сколько всего денег у клиента? A+B=-1000 руб. Добавить результат в таблицу БАЛАНС Начало транзакции 2 Cколько клиентов с отрицательным балансом? 0 select count(*) where Баланс<0 Cколько клиентов с отрицательным балансом? 0 select count(*) where Баланс<0 Cколько клиентов с отрицательным балансом? 1 Подтверждение транзакции Фамилия Баланс Иванов 500 Петров-1000 Сидоров 9000 Подтверждение транзакции

20 Уровень изоляции Фантомное чтение Неповторя ющееся чтение «Грязное» чтение Потерянное обновление ISOLATION_READ_UNCOMMITTED READ UNCOMMITTED –––+ ISOLATION_READ_COMMITTED READ COMMITTED ––++ ISOLATION_REPEATABLE_READ REPEATABLE READ –+++ ISOLATION_SERIALIZABLE SERIALIZABLE++++ Spring :: Tx :: Уровни изоляции Enum org.springframework.transaction.annotation.Isolation

21 Spring :: Tx + AOP

22 Spring :: Tx :: Propagation Распространение транзакции: что происходит с транзакцией при вызове метода? Spring поддерживает следующие способы передачи транзакции от метода к методу в Enum org.springframework.transaction.annotation.Propagation : Required, RequiresNew, Mandatory, NotSupported, Supports, Never

23 Атрибут транзакции Клиентская транзакция Транзакция в бизнес-методе Required – Если транзакция уже начата, использует текущую транзакцию. Если нет – начинает новую транзакцию НетT2 T1 RequiresNew – Приостанавливает текущую транзакцию, начинает новую, выполняет метод, завершает транзакцию и возобновляет остановленную транзакцию. НетT2 T1T2 Mandatory – Проверяет наличие открытой транзакции. Если транзакция не была начата, генерируется исключение TransactionRequiredException. Нет Ошибка T1 NotSupported – Приостанавливает текущую транзакцию, если она начата. Нет T1Нет Supports – Использует текущую транзакцию. Если транзакции нет – работает без транзакции. Нет T1 Never – Если существует транзакция, генерирует исключение RemoteException. Нет T1Ошибка Spring :: Tx :: Propagation org.springframework.transaction.annotation.Propagation

24 Required – если метод вызвал транзакцию, он должен сам ее подтвердить или откатить (если поддерживаются вложенные транзакции); RequiresNew – если транзакция Т2 закончится неуспешно, Т1 все равно возобновится, т.е. тут не соблюдается принцип ACID (особенно атомарность); может использоваться только для логгирования или ведения аудита и т.п. Mandatory – выбросит TransactionRequiredException, если транзакция не была начата; используется в стратегии клиентского дирижирования: клиент определяет, где и когда начинать и завершать транзакцию, например если клиенту необходимо выполнить 2 операции, скажем снять деньги с одного счета и положить на другой, и это нужно обернуть в транзакцию, сами методы снятия стоит пометить как Mandatory Supports – для операций чтения из БД, когда нам нужно читать «грязные» данные; например, если мы добавили новый заказ и хотим получить список всех заказов, метод помеченный как Supports позволит нам увидеть незафиксированный заказ (в отличие от NotSupported – при котором мы увидим только зафиксированные данные) NotSupported – выполнение метода вне контекста транзакции; есть смысл использовать при вызове хранимых процедур, но только если хранимая процедура сама не начинает транзакцию Never – может использоваться для тестирования – если транзакция существовала, будет выброшено исключение Spring :: Tx :: Propagation

25 Spring :: Tx :: Конфигурация DataSourceTransactionManager: <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/> <property name="url" <bean id="txManager" class="org.springframework.jdbc.datasource. DataSourceTransactionManager">

26 Spring :: Tx :: Конфигурация JtaTransactionManager в J2EE контейнере:

27 Spring :: Tx :: Rollback Правила для Rollback по умолчанию: Позволяют задать, какие исключения должны автоматически вызывать отмену транзакции ; По умолчанию, транзакции откатываются только для RuntimeException ; Есть возможность переопределить это = IOException.class, noRollbackFor = RuntimeException.class) public void doSomething() { … }

28 Свойство ТипОписание propagationenum: Propagation Распространение транзакции isolationenum: Isolation Уровень изоляции readOnlyBoolean read/write или read-only Read-only транзакция может работать быстрее и блокировать меньше ресурсов. timeoutint (секунды) задает промежуток времени, после которого транзакция автоматически откатится rollbackFor Массив объектов типа Class, унаследованных от Throwable Массив классов исключений, которые должны вызывать Rollback rollbackForClassname Массив имен классов исключений, унаследованных от Throwable Массив имен исключений, которые должны вызывать Rollback noRollbackFor Массив объектов типа Class, унаследованных от Throwable Массив исключений, которые не должны вызывать Rollback noRollbackForClassname Массив имен классов исключений, унаследованных от Throwable Массив имен исключений, которые не должны вызывать Rollback Свойства Spring :: Tx

29 Spring :: применяется к: Интерфейсам; Классам; Методам в интерфейсе; public методам в лучше всегда применять к конкретным классам и их методам, а не к интерфейсам

30 Spring :: Tx :: Программное управление В большинстве случаев используется декларативное управление транзакциями Особенно, если в приложении много транзакционных операций Программное управление используется в случае: В приложении мало транзакционных операций, в этом случае использование TransactionTemplate может быть приемлемо, но не очень желательно; Необходимо явно задавать имя транзакции.

31 Spring :: Tx :: Программное управление Один из возможный вариантов: используя TransactionTemplate:

32 Spring :: Tx :: Программное управление В этом случае задать все свойства можно программно:

33 Spring :: Tx :: Программное управление В этом случае задать все свойства можно программно: TransactionTemplate поддерживает callback-ориентированный подход; Реализовать TransactionCallback, метод doInTransaction(); Передать его в метод execute() из TransactionTemplate;

34 Spring :: Tx :: Пример конфигурирования <aop:pointcut id="defaultServiceOperation expression="execution(*x.y.service.*Service.*(..))"/> <aop:pointcut id="noTxServiceOperation expression="execution(* x.y.service.ddl.DefaultDdlManager.*(..))"/>

35 Упражнения 8 : «Управление транзакциями в Spring» – 30 мин – самостоятельная работа;

36 Вопросы!?