Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная 14 Транзакции.doc
Скачиваний:
2
Добавлен:
13.11.2019
Размер:
283.65 Кб
Скачать

Государственное образовательное учреждение

Высшего профессионального образования

Санкт-Петербургский государственный политехнический университет

Факультет технической кибернетики

Кафедра измерительных информационных технологий

УТВЕРЖДЕНО

На заседании кафедры ИИТ

Протокол №4

От «__» февраля 2009 г.

Лабораторная работа № 14

по курсам

«Базы данных»

«Системы управления базами данных»

«Управление данными»

Транзакции в SQL

Санкт-Петербург

2009

Цель лабораторной работы: Получение навыков программирования транзакций путем встраивания SQL предложений в язык java.

1. Теоретические сведения

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

Следовательно, едства SQL должны предотвращать нарушения в данных при незавершенных операциях и должны обеспечивать параллельное выполнение операций. Модель работы с базой данных основана на транзакциях.

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

Преобразование в последовательную форму. Рассмотренные транзакции включают операции чтения и записи данных. При их параллельном выполнении возможны серьезные проблемы, связанные с чтением данных, которые в то же самое время изменяет другая незавершенная транзакция. Поэтому СУБД по умолчанию использует режим преобразования транзакций в последовательную форму. Такой режим называется SERIALIZABLE. Он достигается блокированием изменяемых данных до выполнения оператора COMMIT или ROLLBACK. В каждой конкретной СУБД может блокироваться таблица или отдельные кортежи. Чем меньше размер блокируемого элемента данных, тем эффективнее работает база данных в многопользовательском режиме.

Уровни блокирования данных. В СУБД используются разные способы блокирования данных, наиболее распространенные из них следующие:

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

  • Блокирование на уровне базы данных означает, что блокируется физическая область накопителя (пространство таблицы), в которой может размещаться часть таблицы или несколько таблиц.

  • Блокирование на уровне строк применяется к отдельной строке таблицы. В современных БД это самая распространенная блокировка.

  • Блокирование на уровне страницы позволяет защищать физическую область памяти, размер которой настраивается администратором (например, 1 К). Блокирование страниц эффективно с точки зрения производительности БД.

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

Транзакции, предназначенные только для чтения. Если транзакции предназначены только для чтения, и не выполняют модификации данных, то такие транзакции можно выполнять параллельно с меньшими проблемами. Такие транзакции следует обозначить как READ ONLY. В этом случае СУБД разрешает их параллельное выполнение, что значительно повышает производительность БД.

Оператор SET TRANSACTION READ ONLY устанавливает режим “только чтение” и должен выполняться до начала транзакции. Соответственно оператор SET TRANSACTION READ WRITE установит транзакцию в режим для чтения и записи.

Разрешение грязного чтения не зафиксированных данных. Грязные данные – это данные, записанные транзакцией, которая еще не зафиксирована. В случае если записывающая эти данные транзакция будет прервана по какой-либо причине, грязные данные будут удалены. Если другая, параллельно выполняемая транзакция, прочитала грязные данные, использовала их и зафиксировала результат, то этот результат, возможно, является неправильным, не отражающим действительное состояние данных. В зависимости от того, какая транзакция выполнялась, результат может оказаться приемлемым или может быть неприемлемым.

Программист может разрешить грязное чтение, используя оператор SET TRANSACTION READ WRITE ISOLATION LEVEL READ UNCOMMITED, или java-функцию setTransactionIsolation(1) с первым уровнем изоляции транзакций. При этом СУБД должна поддерживать соответствующие уровни изоляции.

Разрешение грязного чтения зафиксированных данных. Уровень изоляции запрещает чтение незафиксированных грязных данных. Однако он позволяет одной и той же транзакции многократно повторять один и тот же запрос и получать на него разные ответы, если эти ответы отражают зафиксированные транзакции. Следовательно, этот уровень изоляции READ COMMITED не гарантирует правильного результата при повторном чтении данных. Режим грязного чтения незафиксированных данных устанавливается оператором SET TRANSACTION READ WRITE ISOLATION LEVEL READ COMMITED, или java функцией setTransactionIsolation(2).

Разрешение повторного чтения. Уровень изоляции REPEATABLE READ допускает повторное чтение данных, при котором не возникает проблемы неповторяющегося чтения. Режим повторяющегося чтения зафиксированных данных устанавливается оператором SET TRANSACTION READ WRITE ISOLATION LEVEL REPEATABLE READ, или java функцией setTransactionIsolation(4).

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

Для многих транзакций эффект фантомных вставок не имеет значения, поэтому для них можно использовать режим REPEATABLE READ.

Преобразование в последовательную форму. По умолчанию в СУБД использует режим преобразования транзакций в последовательную форму. Такой режим называется последовательным и обозначается как SERIALIZABLE. Он достигается блокированием изменяемых данных до выполнения оператора COMMIT или ROLLBACK. Режим последовательного обращения к данным устанавливается оператором SET TRANSACTION READ WRITE ISOLATION LEVEL SERIALIZABLE, или java-функцией setTransactionIsolation(8).

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

Последовательное выполнение транзакций SERIALIZABLE используется СУБД по умолчанию или устанавливается специально, например, java-функцией setTransactionIsolation(8). Режим предназначен для запрещения потерянного обновления, чтения грязных данных, неповторяющегося чтения и чтения кортежей – фантомов. В этом режиме многопользовательская база данных работает медленно, не разрешая параллельное выполнение запросов.

Повторяющееся чтение REPEATABLE READ используется для запрещения потерянного обновления, чтения грязных данных и неповторяющегося чтения. Этот уровень не защищает от ситуации, когда одна транзакция читает все кортежи, удовлетворяющие условию WHERE, а вторая транзакция в это время вставляет кортежи, которые удовлетворяют условию WHERE. При этом если первая транзакция будет заново считывать данные для этих же условий, то при втором чтении она извлечет добавочный фантомный кортеж.

Чтение зафиксированных данных READ COMMITTED используется для запрещения потерянного обновления и грязного чтения. Этот уровень не защищает от ситуации, когда транзакция получает разные ответы на одинаковые запросы, выполненные почти одновременно, поскольку вторая параллельная транзакция в это время изменяет кортежи и фиксирует сделанные изменения. В этом режиме возможно обнаружение фантомной вставки.

Чтение незафиксированных данных READ UNCOMMITTED используется для потерянного обновления. В этом режиме возможно преждевременное чтение, неповторяющееся чтение и чтение фантомных вставок.

При отсутствии блокировок TRANSACTION NONE возможно потерянное обновление, грязное чтение, неповторяющееся чтение, чтение фантомных кортежей. Первой транзакции будут доступны все изменения, выполненные параллельной второй транзакцией до того момента, когда они будут зафиксированы. Если вторая транзакция выполнила откат, то первая будет использовать неправильные данные.

Использование JDBC. Интерфейс JDBC представляет собой разновидность динамического SQL, который поставляется в виде пакетов package.java.sql и package.javax.sql. Пакет java.sql включает класс Driver, предназначенный для взаимодействия с драйверами JDBC, класс Connection для соединения с базой данных, класс Statement, который содержит оператор SQL, выполняемый за один шаг, класс PreparedStatement, включающий подготовленный SQL оператор, который может использовать динамические данные, и класс ResultSet, имеющий курсор и включающий результаты запроса (табл.1).

Таблица 1