Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 9 лет назад пользователемЕвгения Кашкина
1 Модуль 4 Рассматриваемые темы: Понятие транзакции Конкурентный доступ к данным Использование транзакций в JDBC API Транзакции в JDBC API слайд 4-1
2 Транзакции в JDBC API Транзакция – логически неделимый набор операций в базе данных, переводящий данные из одного целостного состояния в другое целостное Типы транзакций: Локальные – на одном источнике данных Распределенные (глобальные) – на нескольких источниках данных Понятие транзакции слайд 4-2
3 Транзакции в JDBC API Атомарность Целостность Изолированность Длительность Свойства транзакций – ACID слайд 4-3
4 Транзакции в JDBC API Источником данных для Java- клиента БД является соединение Поэтому работа с транзакциями в JDBC API осуществляется через интерфейс Connection Всегда следует помнить, что реализация транзакций – vendor- specific Источник данных – репрезентация БД слайд 4-4
5 Транзакции в JDBC API Транзакция имеет начало и завершение Такие транзакции называются плоскими Завершением транзакции может быть подтверждение (commit) или откат (rollback) В каких случаях транзакцию необходимо завершать откатом? Рамки транзакции слайд 4-5
6 Транзакции в JDBC API Режим автофиксации – это режим, где каждый запрос выполняется в рамках персональной транзакции То есть, транзакция подтверждается после каждого запроса В JDBC API режим автофиксации принят по умолчанию Режим автофиксации слайд 4-6
7 Транзакции в JDBC API В JDBC 3 появились savepoints Длительную транзакцию можно разбить на несколько частей с помощью savepoints В случае проблем можно откатить транзакцию до выбранной savepoint Savepoints – попытка реализовать вложенные транзакции Savepoints – точки сохранения слайд 4-7
8 Транзакции в JDBC API Рассматриваемые темы: Понятие транзакции Конкурентный доступ к данным Использование транзакций в JDBC API слайд 4-8
9 Транзакции в JDBC API Две транзакции могут пересечься по времени и по данным Это может привести к нарушению целостности данных, появлению аномалий: «Грязное» чтение Неповторяемое чтение Фантомы Одновременный доступ к данным слайд 4-9
10 Транзакции в JDBC API Транзакция T1 читает еще неподтвержденные данные, которые изменяет транзакция Т2 Если Т2 откатится, то получится, что Т1 работает с нецелостными данными «Грязное» чтение – dirty reads слайд 4-10
11 Транзакции в JDBC API Транзакция T1 читает данные два раза, а между этими чтениями транзакция Т2 изменяет их Т1 получит при двух одинаковых чтениях разные результаты Неповторяемое чтение – unrepeatable reads слайд 4-11
12 Транзакции в JDBC API Транзакция T1 ищет и находит запись, но при попытке её изменения она может отсутствовать Т.к. эта запись появилась в результате еще неподтвержденной транзакции Т2, которая может откатиться Фантомы – phantoms слайд 4-12
13 Транзакции в JDBC API СУБД должна не допустить пересечения транзакций по времени и данным При выполнении одной транзакции другая не должна менять данные, с которыми работает первая Если транзакции пересеклись по данным, СУБД должна сериализовать их (выстроить в очередь) Как избежать аномалий? слайд 4-13
14 Транзакции в JDBC API Итак, транзакции должны быть изолированы друг от друга Как именно СУБД должна изолировать транзакции, определяется уровнем изоляции транзакций Выводы по изоляции транзакций слайд 4-14
15 Транзакции в JDBC API Рассматриваемые темы: Понятие транзакции Конкурентный доступ к данным Использование транзакций в JDBC API слайд 4-15
16 Транзакции в JDBC API В JDBC API нет явного метода старта транзакции В JDBC по умолчанию работает режим автофиксации Управление транзакциями в JDBC API слайд 4-16
17 Транзакции в JDBC API В интерфейсе Connection определен метод, регламентирующий режим автофиксации: void Connection.setAutoCommit(boolean) Для считывания текущего режима можно воспользоваться методом boolean Connection.getAutoCommit() Управление транзакциями слайд 4-17
18 Транзакции в JDBC API Упрощенный каркас программы слайд 4-18 Connection connection = null; Statement statement = null; try { connection = DriverManager.getConnection( DBURL, user", pwd ); statement = conn.createStatement(); connection.setAutoCommit( false ); statement.executeUpdate( SQL1 ); statement.executeUpdate( SQL2 ); conn.commit(); } catch( SQLException se ) { try { conn.rollback(); } catch( SQLException se2 ) { se2.printStackTrace(); } } finally { try { if( conn!=null ) conn.close(); } catch( SQLException se ) { se.printStackTrace(); } }
19 Транзакции в JDBC API Выводы по запуску и финалу транзакций слайд 4-19 Connection connection = null; Statement statement = null; try { connection = DriverManager.getConnection( DBURL, user", pwd ); statement = conn.createStatement(); connection.setAutoCommit( false ); statement.executeUpdate( SQL1 ); statement.executeUpdate( SQL2 ); conn.commit(); } catch( SQLException se ) { try { conn.rollback(); } catch( SQLException se2 ) { se2.printStackTrace(); } } finally { try { if( conn!=null ) conn.close(); } catch( SQLException se ) { se.printStackTrace(); } }
20 Транзакции в JDBC API Интерфейс Connection предлагает методы работы с уровнями изоляции: void setTransactionIsolation(int) int getTransactionIsolation() Они должны вызываться до старта транзакции (если во время, то результат vendor-specific) Узнать, поддерживается ли вообще этот механизм, можно из метаинформации Изоляция транзакций в JDBC API слайд 4-20
21 Транзакции в JDBC API Уровни изоляции, заданные в JDBC API определены как статические константы интерфейса Connection Важно помнить, что поддержка конкретных уровней – vendor specific Изоляция транзакций в JDBC API слайд 4-21
22 Транзакции в JDBC API Connection.TRANSACTION_NONE Транзакции не поддерживаются Connection.TRANSACTION_READ_UNCOMMITTED Присутствуют все три аномалии. Минимальный уровень Connection.TRANSACTION_READ_COMMITTED Отсутствует «грязное» чтение Connection.TRANSACTION_REPEATABLE_READ Отсутствует «грязное» и неповторяемое чтение Connection.TRANSACTION_SERIALIZABLE Отсутствуют все три аномалии. Максимальный уровень Уровни изоляции в JDBC API слайд 4-22
23 Транзакции в JDBC API Пример работы с уровнями изоляции слайд 4-23 Connection connection = null; Statement statement = null; try { connection = DriverManager.getConnection( DBURL, user", pwd ); statement = conn.createStatement(); connection.setAutoCommit( false ); connection.setTransactionIsolation( Connection.TRANSACTION_SERIALIZABLE ); statement.executeUpdate( SQL1 ); statement.executeUpdate( SQL2 ); conn.commit(); } catch( SQLException se ) { try { conn.rollback(); } catch( SQLException se2 ) { se2.printStackTrace(); } } finally { try { if( conn!=null ) conn.close(); } catch( SQLException se ) { se.printStackTrace(); } }
24 Транзакции в JDBC API Чем выше уровень изоляции, тем выше нагрузка на СУБД СУБД может поддерживать не все уровни изоляции Важно правильно работать с транзакциями в случае ошибок ( SQLException ) и предупреждений ( SQLWarning ) Выводы по работе с транзакциями слайд 4-24
25 Транзакции в JDBC API Рассмотренные темы: Понятие транзакции Конкурентный доступ к данным Использование транзакций в JDBC API слайд 4-25
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.