Опубликован: 11.03.2009 | Доступ: свободный | Студентов: 2792 / 683 | Оценка: 4.22 / 4.22 | Длительность: 11:41:00
Лекция 8:

Репликация данных. Виды и свойства репликации. Сравнение механизмов репликации в MS SQL Server 2005 и ORACLE Server 10g

< Лекция 7 || Лекция 8: 123 || Лекция 9 >
Методы разрешения конфликтов уникальности

В Oracle существует три способа разрешения конфликтов уникальности:

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

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

Методы разрешения конфликтов удаления

Ни Oracle ни MS SqlServer не имеют средств для разрешения конфликтов удаления.

Методы разрешения конфликтов обновления
Приоритет узла (Site priority в Oracle и MS SqlServer)

При разрешении конфликта выбирается обновление, которое сделано на узле с наибольшим приоритетом.

В Oracle это метод является разновидностью более общего метода "группа приоритетов" (Priority group). В MS SqlServer этот метод является методом разрешения конфликта по умолчанию.

В Oracle для использования этого метода необходимо в системной таблицы задать значения приоритетов для всех узлов в среде репликации, а также в реплицируемой таблице создать столбец, который будет хранить имя узла. В SqlServer также необходимо задать приоритеты узлов. Это можно сделать явно(глобальная подписка) или неявно(локальная подписка). В случае использования локальной подписки при расчете приоритета используется приоритет узла издателя (Publisher). В Oracle метод может применяться для любых групп столбцов. В MS SqlServer метод может применяться как в случае отслеживания изменений на уровне столбцов ( column-level tracking ), так и при отслеживании изменений на уровне строк ( row-level tracking ).

Сложение(Additive в Oracle и MS SqlServer)

Данный метод не выбирает одно из конфликтующих обновлений, а вместо этого объединяет результаты обновление в одно результирующие значение. В Oracle результат рассчитывается по формуле: current value = current value + (new value - old value), где current value - значение на узле приемнике (destination site), а new value и old value - соответственно новое и старое значение на узле источнике (originating site). Таким образом, к значению на узле приемнике добавляется изменение, сделанные на узле источнике за время, прошедшее после последнего сеанса синхронизации. В MS SqlServer результат рассчитывается по формуле: current value = current value + new value. Т.е. результат является простой суммой конфликтующих обновлений.

Применение этого метода требует наличие в таблице столбца целочисленного типа. В Oracle метод может применяться только для групп столбцов состоящих из одного столбца. В MS SqlServer метод может применяться, только если изменения отслеживаются на уровне столбцов.

Усреднение(Average в Oracle и MS SqlServer)

Данный метод также не выбирает одно из конфликтующих обновлений, а вместо этого объединяет результаты обновление в одно результирующие значение, путем усреднения, т.е. по формуле current value = (current value + new value)/2.

Ограничения на применения метода такие же, как и для предыдущего метода.

Последняя временная метка(Latest Timestamp в Oracle, DATETIME (Earlier Wins) в MS SqlServer)

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

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

Первая временная метка(Earliest Timestamp в Oracle, DATETIME (LaterWins) в MS SqlServer)

В результате разрешения конфликта этим методом, выигрывает обновление, имеющие более раннюю временную метку.

Ограничения на применения метода и замечания, связанные с его применением, такие же, как и для предыдущего метода.

Максимальное значение (Maximum в Oracle и MS SqlServer)

При разрешении конфликта из конфликтующих обновлений выбирается обновление с максимальным значением. В случае совпадения значений метод не может разрешить конфликт.

Для применения метода в таблице должен быть столбец, тип данных которого допускает операцию сравнения. В Oracle метод может применяться для любых групп столбцов. В MS SqlServer метод может применяться как в случае отслеживания изменений на уровне столбцовтак и при отслеживании изменений на уровне строк.

Минимальное значение (Minimum в Oracle и MS SqlServer)

При разрешении конфликта из конфликтующих обновлений выбирается обновление с минимальным значением. В случае совпадения значений метод не может разрешить конфликт.

Ограничения на применения метода такие же, как и для предыдущего метода.

Текстовое слияние (Merge Text в MS SqlServer)

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

Для применения метода в таблице должен быть столбец текстового типа. Метод может применяться, только если изменения отслеживаются на уровне столбцов.

Подписчик всегда выигрывает (Subscriber Always Wins в MS SqlServer)

Обновление от Подписчика всегда побеждает в конфликте, не зависимо от того является ли подписчик источником или приемником.

Метод может применяться для всех типов конфликтов.

Группа приоритетов (Priority group в Oracle)

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

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

Отбрасывание(Discard в Oracle)

В результате разрешение конфликта эти методом значение, полученное от узла источника, отбрасывается, т.е. значение на узле приемнике остается неизмененным.

Никаких дополнительных условий для применения метода не требуется. Метод может применяться для любых групп столбцов.

Перезапись (Overwrite в Oracle)

В результате разрешение конфликта эти методом значение, значение на узле приемнике перезаписывается значением от узла источника.

Никаких дополнительных условий для применения метода не требуется. Метод может применяться для любых групп столбцов.

Также обе СУБД позволяют задать собственные методы разрешения конфликтов.

Однако, несмотря на то, что в современных СУБД существуют развитые средства, позволяющие как предотвращать возникновение конфликтов, так и разрешать возникающие конфликты, возникают задачи, которые требуют разработки и реализации новых методов предотвращения и разрешения конфликтов.

Практические занятия

Постановка задачи. Проектирование данных на концептуальном и логическом уровнях. Нормализация отношений.

Презентация по 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:1433;databaseName=o01;", 
                // localhost - сервер СУБД, o01 - имя базы данных
                "sa", "123"); // пользователь, пароль
        
        /* ======== Подключение к Oracle ============
        // Загрузка драйвера
        Class.forName("oracle.jdbc.OracleDriver");
        // Соединение с базой данных
        Connection connection = DriverManager.getConnection(
                        "jdbc:oracle:thin:@localhost:1521: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 СУБД

Презентация

< Лекция 7 || Лекция 8: 123 || Лекция 9 >
Александра Каева
Александра Каева
Светлана Токаревская
Светлана Токаревская

Добрый день! Скажите пожалуйста, так и задумано, что в каждой лекции приложен один и тот же приктикум?