четверг, 19 июля 2012 г.

Пост 9. ACID.

Доброго времени суток!
Итак продолжаю свое повествование об Oracle NoSQL Database. Сегодня хотел бы рассказать о таких понятиях, как ACID и BASE. Итак, начнем с ACID, я уверен, что большинство знает, что это такое, но все же хотел бы повториться.


Atomicity — Атомарность
Атомарность гарантирует, что никакая транзакция не будет зафиксирована в системе частично. Будут либо выполнены все её подоперации, либо не выполнено ни одной. 

Представьте себе простейшую банковскую операцию в которой деньги с одного счета преводятся на другой. Это мининум 2 операции БД - снять деньги с одного счета и пополнить другой. Не камильфо будет если с одного счета будут сняты деньги, а на счет 2 не поступят. Принцип атомарности в этом случае не будет выпонен.

Consistency — Согласованность
Система находится в согласованном состоянии до начала транзакции и должна остаться в согласованном состоянии после завершения транзакции.

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

Isolation — Изолированность
Во время выполнения транзакции другие процессы не должны видеть данные в промежуточном состоянии.


Durability — Долговечность
Независимо от проблем на нижних уровнях (к примеру, обесточивание системы или сбои в оборудовании) изменения, сделанные успешно завершённой транзакцией, должны остаться сохранёнными после возвращения системы в работу.

Другими словами если пользователь внес данные в вашу систему и почил подтверждение о том, что они успешно записаны, они не должны быть потеряны, вне зависимости ни отчего (пропало питание в ЦОД, посыпался диск...).

В противовес концепции ACID стоит концепция BASE.

BASE - Basically Available, Soft state, Eventual consistency

Базовая доступность, неустойчивое состояние, согласованность в конечном счёте
- в принципе доступна
- в принципе знаем состояние
- когда-нибудь сойдется


NoSQL DB - система хамелеон, в зависимости от Ваших пожеланий она может с разной степенью поддерживать любую концепцию парадигмы ACID. Как?
Об этом читайте в последующих постах!

Если у вас есть какие-либо вопросы по Oracle NoSQL - задавайте в комментах, постараюсь ответить, либо пишите на oracle.nosql@gmail.com
Пост 8. CRUD. Delete.

Итак, едем дальше. Создавать записи мы уже умеем. Умеем вытаскивать записи и умеем иъ изменять. Осталось только научиться удалять. Тут все предельно просто.


    public static void DeleteKey(String sKey, String store, String host, String port) {
        OraStore orastore = new OraStore(store, host, port);
        KVStore myStore = orastore.getStore();
        System.out.println("Store Opened");
        Key myKey = ParseKey.ParseKey(sKey);
        myStore.delete(myKey);
        myStore.close();
        System.out.println("Store Closed");
    }

Собственно, добавить мне нечего. От "скуки" я даже немного изменил концепцию - добавив коннект к базе кнутрь метода :) .
Ну и дабы разбавить этот достаточно неинтересный пост (будем объективны), привожу метод, который удаляет всю Вашу базу - очень удобно для разработки.


public static void ClearStore(String store, String host, String port) {
        OraStore orastore = new OraStore(store, host, port);
        KVStore myStore = orastore.getStore();
        System.out.println("Store Opened");

        System.out.println("Cleaning Store ...");

        Iterator<Key> keyIter = myStore.storeKeysIterator(Direction.UNORDERED, 0, null, null, null);
        Key key = null;
        List<String> majorPath = null;
        String majorPathStr = null;
        Hashtable<String, String> majorKeyHash = new Hashtable<String, String>();
        Integer count = 0;
        while (keyIter.hasNext()) {
            key = keyIter.next();
                  majorPath = key.getMajorPath();
            majorPathStr = majorPath.toString();
            if (!majorKeyHash.containsKey(majorPathStr)) {
                majorKeyHash.put(majorPathStr, majorPathStr);
                Key newkey = Key.createKey(majorPath);
                myStore.multiDelete(newkey, null, null);
                System.out.println(++count + " " + majorPathStr);
            }

        } //EOF while
        System.out.println("\nKVStore cleaned.");
        myStore.close();
        System.out.println("Store Closed");
    }

На сегодня наверное все.
Если у вас есть какие-либо вопросы по Oracle NoSQL - задавайте в комментах, постараюсь ответить, либо пишите на oracle.nosql@gmail.com.