• Главная
  • Карта сайта
Не найдено

НОУ ІНТУЇТ | лекція | Поняття транзакції. Неявні і явні транзакції. Рівні ізольованості транзакцій в MS SQL Server 2005 і ORACLE 10g. Поняття блокувань. Основні типи блокувань

  1. Поняття блокувань. Основні типи блокувань Блокування - це механізм, який використовується для управління...
  2. Практичні заняття
  3. Підготовка SQL скриптів генерації схеми відносин БД в ERwin. Розробка скрипта для введення тестової...
  4. Архітектура MS SQL Server 2005. Налагодження та використання основних компонент середовища. Створення...
  5. Робота з СУБД MS SQL Server 2005, ORACLE 10g. Приклади з'єднань з БД, технології розробки кліенского додатки
  6. Робота з базами даних з J2EE Web-контейнера
  7. Об'єктно-реляційне відображення для роботи з базами даних
  8. Використання препроцесора для роботи з API СУБД

Поняття блокувань. Основні типи блокувань

Блокування - це механізм, який використовується для управління одночасним доступом до загального ресурсу. Блокування відбувається, коли один сеанс утримує ресурс, запитуваний іншим сеансом. В результаті запитувач сеанс буде заблокований - він "зависне" до тих пір, поки що утримує сеанс завершить роботу з ресурсом.

Оптимістичне блокування (optimistic locking) - стратегія блокування набору даних, при якій розділ, що містить змінну запис, блокується тільки на час внесення змін до запису програмою, але не користувачем.

Песимістичне блокування (pessimistic locking) - стратегія блокування набору даних, при якій розділ, що містить змінну запис, блокується на весь час внесення змін до запису користувачем і не доступна для редагування іншим користувачам.

Особливість механізму блокувань Oracle - блокування даних не зберігаються як окремий ресурс, а містяться безпосередньо в блоках даних. Це дозволяє уникнути таких проблем, як ескалація блокувань. Нижче перераховані п'ять основних класів блокувань в Oracle. Перші три - загальні (використовуються у всіх базах даних Oracle), а дві інші - тільки в OPS (Oracle Parallel Server - паралельний сервер).

  1. Блокування ЯМД (DML locks). ЯМД означає мову маніпулювання даними (Data Manipulation Language), тобто оператори SELECT, INSERT, UPDATE і DELETE. До блокувань ЯМД відносяться, наприклад, блокування рядки даних або блокування на рівні таблиці, яка зачіпає всі рядки таблиці.
  2. Блокування ЯОД (DDL locks). ЯОД означає мову визначення даних (Data Definition Language), тобто оператори CREATE, ALTER і так далі. Блокування ЯОД захищають визначення структур об'єктів.
  3. Внутрішні блокування (internal locks) і засувки (latches). Засувки - це прості низькорівневі засоби забезпечення послідовності звернень. Засувки зазвичай запитуються системою в режимі очікування. Це означає, що, якщо засувку можна встановити, запитувач сеанс призупиняє роботу на короткий час, а потім намагається повторити операцію. Інші засувки можуть запитуватися в оперативному режимі, тобто процес буде робити щось інше, не чекаючи можливості встановити засувку. Засувки виділяються випадковим чином. Внутрішні блокування - більш складний засіб забезпечення черговості доступу, вони дозволяють запитувачу "встати в чергу" в очікуванні звільнення ресурсу. Запитувач засувку відразу повідомляється про звільнення ресурсу. У разі внутрішньої блокування запитувач повністю блокується.
  4. Розподілені блокування (distributed locks). Ці блокування використовуються сервером OPS для узгодження ресурсів машин, що входять в кластер. Розподілені блокування встановлюються екземплярами баз даних, а не окремими транзакціями.
  5. Блокування паралельного управління кешем (PCM - Parallel Cache Management Locks). Такі блокування захищають блоки даних в кеші при використанні їх декількома екземплярами баз даних.

SQL Server підтримує три основних типи блокувань:

  1. Shared Lock - колективна блокування, яка використовується при виконанні операції читання даних. Дозволяється читання даних інший транзакцією, але заборонено зміна даних.
  2. Exclusive Lock - монопольна блокування, яка застосовується при зміні даних. Це блокування повністю забороняє доступ до даних іншим транзакцій.
  3. 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-моделювання

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-скрипти, проект і вихідні коди 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 =?
Провайдеры:
  • 08.09.2015

    Batyevka.NET предоставляет услуги доступа к сети Интернет на территории Соломенского района г. Киева.Наша миссия —... 
    Читать полностью

  • 08.09.2015
    IPNET

    Компания IPNET — это крупнейший оператор и технологический лидер на рынке телекоммуникаций Киева. Мы предоставляем... 
    Читать полностью

  • 08.09.2015
    Boryspil.Net

    Интернет-провайдер «Boryspil.net» начал свою работу в 2008 году и на данный момент является одним из крупнейших поставщиков... 
    Читать полностью

  • 08.09.2015
    4OKNET

    Наша компания работает в сфере телекоммуникационных услуг, а именно — предоставлении доступа в сеть интернет.Уже... 
    Читать полностью

  • 08.09.2015
    Телегруп

    ДП «Телегруп-Украина» – IT-компания с 15-летним опытом работы на рынке телекоммуникационных услуг, а также официальный... 
    Читать полностью

  • 08.09.2015
    Софтлинк

    Высокая скоростьМы являемся участником Украинского центра обмена трафиком (UA — IX) с включением 10 Гбит / сек... 
    Читать полностью