НОУ ІНТУЇТ | лекція | Поняття транзакції. Неявні і явні транзакції. Рівні ізольованості транзакцій в MS SQL Server 2005 і ORACLE 10g. Поняття блокувань. Основні типи блокувань
- Поняття блокувань. Основні типи блокувань Блокування - це механізм, який використовується для управління...
- Практичні заняття
- Підготовка SQL скриптів генерації схеми відносин БД в ERwin. Розробка скрипта для введення тестової...
- Архітектура MS SQL Server 2005. Налагодження та використання основних компонент середовища. Створення...
- Робота з СУБД MS SQL Server 2005, ORACLE 10g. Приклади з'єднань з БД, технології розробки кліенского додатки
- Робота з базами даних з J2EE Web-контейнера
- Об'єктно-реляційне відображення для роботи з базами даних
- Використання препроцесора для роботи з API СУБД
Поняття блокувань. Основні типи блокувань
Блокування - це механізм, який використовується для управління одночасним доступом до загального ресурсу. Блокування відбувається, коли один сеанс утримує ресурс, запитуваний іншим сеансом. В результаті запитувач сеанс буде заблокований - він "зависне" до тих пір, поки що утримує сеанс завершить роботу з ресурсом.
Оптимістичне блокування (optimistic locking) - стратегія блокування набору даних, при якій розділ, що містить змінну запис, блокується тільки на час внесення змін до запису програмою, але не користувачем.
Песимістичне блокування (pessimistic locking) - стратегія блокування набору даних, при якій розділ, що містить змінну запис, блокується на весь час внесення змін до запису користувачем і не доступна для редагування іншим користувачам.
Особливість механізму блокувань Oracle - блокування даних не зберігаються як окремий ресурс, а містяться безпосередньо в блоках даних. Це дозволяє уникнути таких проблем, як ескалація блокувань. Нижче перераховані п'ять основних класів блокувань в Oracle. Перші три - загальні (використовуються у всіх базах даних Oracle), а дві інші - тільки в OPS (Oracle Parallel Server - паралельний сервер).
- Блокування ЯМД (DML locks). ЯМД означає мову маніпулювання даними (Data Manipulation Language), тобто оператори SELECT, INSERT, UPDATE і DELETE. До блокувань ЯМД відносяться, наприклад, блокування рядки даних або блокування на рівні таблиці, яка зачіпає всі рядки таблиці.
- Блокування ЯОД (DDL locks). ЯОД означає мову визначення даних (Data Definition Language), тобто оператори CREATE, ALTER і так далі. Блокування ЯОД захищають визначення структур об'єктів.
- Внутрішні блокування (internal locks) і засувки (latches). Засувки - це прості низькорівневі засоби забезпечення послідовності звернень. Засувки зазвичай запитуються системою в режимі очікування. Це означає, що, якщо засувку можна встановити, запитувач сеанс призупиняє роботу на короткий час, а потім намагається повторити операцію. Інші засувки можуть запитуватися в оперативному режимі, тобто процес буде робити щось інше, не чекаючи можливості встановити засувку. Засувки виділяються випадковим чином. Внутрішні блокування - більш складний засіб забезпечення черговості доступу, вони дозволяють запитувачу "встати в чергу" в очікуванні звільнення ресурсу. Запитувач засувку відразу повідомляється про звільнення ресурсу. У разі внутрішньої блокування запитувач повністю блокується.
- Розподілені блокування (distributed locks). Ці блокування використовуються сервером OPS для узгодження ресурсів машин, що входять в кластер. Розподілені блокування встановлюються екземплярами баз даних, а не окремими транзакціями.
- Блокування паралельного управління кешем (PCM - Parallel Cache Management Locks). Такі блокування захищають блоки даних в кеші при використанні їх декількома екземплярами баз даних.
SQL Server підтримує три основних типи блокувань:
- Shared Lock - колективна блокування, яка використовується при виконанні операції читання даних. Дозволяється читання даних інший транзакцією, але заборонено зміна даних.
- Exclusive Lock - монопольна блокування, яка застосовується при зміні даних. Це блокування повністю забороняє доступ до даних іншим транзакцій.
- Update Lock - блокування оновлення, яка є проміжною між розділяється і монопольної блокуванням. Використовується, коли транзакція хоче оновити дані в якийсь найближчий момент часу, але не зараз, і, коли цей момент настане, не хоче чекати іншого транзакції. В цьому випадку іншим транзакцій дозволяється встановлювати колективні блокування, але не дозволяє встановлювати монопольні.
Блокування можуть встановлюватися на трьох рівнях -
- Рівень рядків - рівень за замовчуванням.
- Рівень сторінки - використовується для більш ефективного використання ресурсів і в разі якщо в даній сторінці багато рядків з цієї блокуванням.
- Рівень таблиці - використовується при операціях над таблицею і в разі ескалації блокувань.
взаимоблокировки
Можлива ситуація, коли дві транзакції блокують один одного так, що продовження роботи неможливо без примусового завершення однієї з транзакцій.
приклад:
create table t (i number, j number, s_i varchar2 (100), s_j varchar2 (100)); сеанс # 1 сеанс №2 Update t set s_i = 'рядок' where i = 1 Update t set s_j = 'рядок' where j = 1 Update t set s_j = 'рядок' where j = 1 очікування Update t set s_i = 'рядок 'where i = 1 очікування
Для вирішення такої ситуації монітор транзакцій вибирає одну з транзакцій для примусового завершення.
Практичні заняття
Постановка задачі. Проектування даних на концептуальному і логічному рівнях. Нормалізація відносин.
Презентація по ER-моделювання
ER нотації
Приклад моделі в ERwin
Підготовка SQL скриптів генерації схеми відносин БД в ERwin. Розробка скрипта для введення тестової інформації.
Відео-презентація (Для програвання потрібно Windows Media Player)
Архітектура MS SQL Server 2005. Налагодження та використання основних компонент середовища. Створення навчальної бази даних.
Відео-презентація (Для програвання потрібно Windows Media Player)
Робота з СУБД MS SQL Server 2005, ORACLE 10g. Приклади з'єднань з БД, технології розробки кліенского додатки
Використання технології Java Database Connectivity (JDBC) для роботи з базами даних
презентація
Приклади до презентації
SQL-скрипти, проект і вихідні коди
package org.mai806.jdbcsample; import java.sql. *; public class QuerySample {public static void main (String [] args) throws Exception {/ * ======== Підключення до MS SQL Server ===== * / // Завантаження драйвера Class.forName ( "com. microsoft.sqlserver.jdbc.SQLServerDriver "); // З'єднання з базою даних Connection connection = DriverManager.getConnection ( "jdbc: sqlserver: // localhost: 1 433; databaseName = o01;", // localhost - сервер СУБД, o01 - ім'я бази даних "sa", "123") ; // користувач, пароль / * ======== Підключення до Oracle ============ // Завантаження драйвера Class.forName ( "oracle.jdbc.OracleDriver"); // З'єднання з базою даних Connection connection = DriverManager.getConnection ( "jdbc: oracle: thin: @localhost: 1 521: orcl", // localhost - сервер СУБД, orcl - SID бази оракла "o01", "o01"); // користувач, пароль // Створення Statement PreparedStatement stmt = connection.prepareStatement ( "select ID, NAME from PERSON where NAME like?"); stmt.setString (1, "% S%"); // Виконання запиту ResultSet rs = stmt.executeQuery (); // Перебір результату виконання запиту while (rs.next ()) {// Приклад вибору параметра за номером або по імені System.out.println ( "ID:" + rs.getLong (1) + "; NAME =" + rs .getString ( "NAME")); } // закриття використаних ресурсів БД rs.close (); stmt.close (); connection.close (); }} Лістинг P.1. Виконання запиту: QuerySample.java package org.mai806.jdbcsample; import java.sql. *; import java.util.ResourceBundle; public class StoredProcedureSample {private static Connection connection = null; public static void main (String [] args) throws Exception {// Отримання сполуки з значень параметрів у файлі properties ResourceBundle properties = ResourceBundle.getBundle ( "database"); Class.forName (properties.getString ( "driver")); connection = DriverManager.getConnection (properties.getString ( "url"), properties.getString ( "user"), properties.getString ( "password")); transferAmount (1,2,100.0); connection.close (); } / ** * Перекладає зазначену суму з одного рахунку на інший * @param from рахунок платника * @param to рахунок одержувача * @param amount сума * / public static void transferAmount (long from, long to, double amount) throws Exception {/ / Створення Statement CallableStatement stmt = connection.prepareCall ( "{call TransferAmount (?,?,?)}"); // Установка параметрів stmt.setLong (1, from); stmt.setLong (2, to); stmt.setDouble (3, amount); // Виконання процедури stmt.execute (); }} Лістинг P.2. Виконання процедури, що: StoredProcedureSample.java package org.mai806.jdbcsample; import java.sql. *; import java.util.ResourceBundle; public class TransactionalSample {private static Connection connection = null; public static void main (String [] args) throws Exception {// Отримання сполуки з значень параметрів у файлі properties ResourceBundle properties = ResourceBundle.getBundle ( "database"); Class.forName (properties.getString ( "driver")); connection = DriverManager.getConnection (properties.getString ( "url"), properties.getString ( "user"), properties.getString ( "password")); // Ручне управління транзакціями connection.setAutoCommit (false); try {transferAmount (2, 1, 10.0); } Finally {connection.close (); }} / ** * Перекладає зазначену суму з одного рахунку на інший * @param from рахунок платника * @param to рахунок одержувача * @param amount сума * / public static void transferAmount (long from, long to, double amount) throws Exception { PreparedStatement stmt = null; Statement query = null; try {stmt = connection.prepareStatement ( "update ACCOUNT set AMOUNT = AMOUNT +? where ID =?"); // Забираємо суму з рахунку платника stmt.setDouble (1, -amount); stmt.setLong (2, from); stmt.execute (); // Додаємо суму на рахунок одержувача stmt.setDouble (1, amount); stmt.setLong (2, to); stmt.execute (); // Пост-перевірка: негативність рахунку платника query = connection.createStatement (); ResultSet rs = query.executeQuery ( "select AMOUNT from ACCOUNT where ID =" + from + "and AMOUNT <0"); if (rs.next ()) {throw new Exception ( "На рахунку №" + from + "недосточності засобів [" + (amount + rs.getDouble (1)) + "] для зняття суми [" + amount + "]") ; } Connection.commit (); System.out.println ( "Перерахування коштів успішно виконано"); } Catch (Exception e) {e.printStackTrace (); connection.rollback (); } Finally {if (stmt! = Null) stmt.close (); if (query! = null) query.close (); }}} Лістинг P.3. Робота з транзакціями: TransactionalSample.java
Робота з базами даних з J2EE Web-контейнера
презентація
Об'єктно-реляційне відображення для роботи з базами даних
презентація
Використання препроцесора для роботи з API СУБД
презентація
Select ID, NAME from PERSON where NAME like?Update ACCOUNT set AMOUNT = AMOUNT +?
Where ID =?