Модуль 4 Рассматриваемые темы: Понятие транзакции Конкурентный доступ к данным Использование транзакций в JDBC API Транзакции в JDBC API слайд 4-1
Транзакции в JDBC API Транзакция – логически неделимый набор операций в базе данных, переводящий данные из одного целостного состояния в другое целостное Типы транзакций: Локальные – на одном источнике данных Распределенные (глобальные) – на нескольких источниках данных Понятие транзакции слайд 4-2
Транзакции в JDBC API Атомарность Целостность Изолированность Длительность Свойства транзакций – ACID слайд 4-3
Транзакции в JDBC API Источником данных для Java- клиента БД является соединение Поэтому работа с транзакциями в JDBC API осуществляется через интерфейс Connection Всегда следует помнить, что реализация транзакций – vendor- specific Источник данных – репрезентация БД слайд 4-4
Транзакции в JDBC API Транзакция имеет начало и завершение Такие транзакции называются плоскими Завершением транзакции может быть подтверждение (commit) или откат (rollback) В каких случаях транзакцию необходимо завершать откатом? Рамки транзакции слайд 4-5
Транзакции в JDBC API Режим автофиксации – это режим, где каждый запрос выполняется в рамках персональной транзакции То есть, транзакция подтверждается после каждого запроса В JDBC API режим автофиксации принят по умолчанию Режим автофиксации слайд 4-6
Транзакции в JDBC API В JDBC 3 появились savepoints Длительную транзакцию можно разбить на несколько частей с помощью savepoints В случае проблем можно откатить транзакцию до выбранной savepoint Savepoints – попытка реализовать вложенные транзакции Savepoints – точки сохранения слайд 4-7
Транзакции в JDBC API Рассматриваемые темы: Понятие транзакции Конкурентный доступ к данным Использование транзакций в JDBC API слайд 4-8
Транзакции в JDBC API Две транзакции могут пересечься по времени и по данным Это может привести к нарушению целостности данных, появлению аномалий: «Грязное» чтение Неповторяемое чтение Фантомы Одновременный доступ к данным слайд 4-9
Транзакции в JDBC API Транзакция T1 читает еще неподтвержденные данные, которые изменяет транзакция Т2 Если Т2 откатится, то получится, что Т1 работает с нецелостными данными «Грязное» чтение – dirty reads слайд 4-10
Транзакции в JDBC API Транзакция T1 читает данные два раза, а между этими чтениями транзакция Т2 изменяет их Т1 получит при двух одинаковых чтениях разные результаты Неповторяемое чтение – unrepeatable reads слайд 4-11
Транзакции в JDBC API Транзакция T1 ищет и находит запись, но при попытке её изменения она может отсутствовать Т.к. эта запись появилась в результате еще неподтвержденной транзакции Т2, которая может откатиться Фантомы – phantoms слайд 4-12
Транзакции в JDBC API СУБД должна не допустить пересечения транзакций по времени и данным При выполнении одной транзакции другая не должна менять данные, с которыми работает первая Если транзакции пересеклись по данным, СУБД должна сериализовать их (выстроить в очередь) Как избежать аномалий? слайд 4-13
Транзакции в JDBC API Итак, транзакции должны быть изолированы друг от друга Как именно СУБД должна изолировать транзакции, определяется уровнем изоляции транзакций Выводы по изоляции транзакций слайд 4-14
Транзакции в JDBC API Рассматриваемые темы: Понятие транзакции Конкурентный доступ к данным Использование транзакций в JDBC API слайд 4-15
Транзакции в JDBC API В JDBC API нет явного метода старта транзакции В JDBC по умолчанию работает режим автофиксации Управление транзакциями в JDBC API слайд 4-16
Транзакции в JDBC API В интерфейсе Connection определен метод, регламентирующий режим автофиксации: void Connection.setAutoCommit(boolean) Для считывания текущего режима можно воспользоваться методом boolean Connection.getAutoCommit() Управление транзакциями слайд 4-17
Транзакции в 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(); } }
Транзакции в 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(); } }
Транзакции в JDBC API Интерфейс Connection предлагает методы работы с уровнями изоляции: void setTransactionIsolation(int) int getTransactionIsolation() Они должны вызываться до старта транзакции (если во время, то результат vendor-specific) Узнать, поддерживается ли вообще этот механизм, можно из метаинформации Изоляция транзакций в JDBC API слайд 4-20
Транзакции в JDBC API Уровни изоляции, заданные в JDBC API определены как статические константы интерфейса Connection Важно помнить, что поддержка конкретных уровней – vendor specific Изоляция транзакций в JDBC API слайд 4-21
Транзакции в JDBC API Connection.TRANSACTION_NONE Транзакции не поддерживаются Connection.TRANSACTION_READ_UNCOMMITTED Присутствуют все три аномалии. Минимальный уровень Connection.TRANSACTION_READ_COMMITTED Отсутствует «грязное» чтение Connection.TRANSACTION_REPEATABLE_READ Отсутствует «грязное» и неповторяемое чтение Connection.TRANSACTION_SERIALIZABLE Отсутствуют все три аномалии. Максимальный уровень Уровни изоляции в JDBC API слайд 4-22
Транзакции в 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(); } }
Транзакции в JDBC API Чем выше уровень изоляции, тем выше нагрузка на СУБД СУБД может поддерживать не все уровни изоляции Важно правильно работать с транзакциями в случае ошибок ( SQLException ) и предупреждений ( SQLWarning ) Выводы по работе с транзакциями слайд 4-24
Транзакции в JDBC API Рассмотренные темы: Понятие транзакции Конкурентный доступ к данным Использование транзакций в JDBC API слайд 4-25