26 April, 2009

Критерии выбора блокировок

Так как использование блокировок по-разному влияет на производительность, необходимо выбирать, в каких случаях какой вид блокировок лучше использовать.
Условие Пессимистичная Оптимистичная Сверх-оптимистичная
Конфликты часты +
Конфликты редки +
Данные только добавляются (например, журнал) +
Данные только читаются (справочники) +
Критерии выбора блокировок

24 April, 2009

Транзакции в реляционных базах данных

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

Характеристики транзакций

В конце 1970-х Джим Грей выделил следующие характеристики транзакций:
  • Атомарность (Atomicity)
  • Непротиворечивость (Consistency)
  • Изолированность (Isolation)
  • Долговечность (Durability)
Атомарность означает, что все действия, производимые в рамках одной транзакции атомарны. Если транзакция заканчивается не успешно, то все изменения, сделанный в рамках этой транзакции откатываются назад. Если транзакция заканчивается успешно, то все её изменения сохраняются. Непротиворечивость означает, что транзакция переводит базу данных из одного непротиворечивого состояния в другое непротиворечивое состояние. При этом, внутри транзакции база данных может находиться в противоречивом состоянии. Изолированность означает, что во время работы одной транзакции ей недоступны изменения, происходящие в другой транзакции. Под долговечностью подразумевают, что после окончания транзакции все изменения, сделанные транзакцией фиксируется навсегда, то есть, если происходит программно-аппаратный сбой, то после восстановления системы в рабочее состояние нет потерянных изменений.

Уровни изоляции транзакций

При параллельном выполнении нескольких транзакций могут возникнуть следующие проблемы:
  • Потерянное обновление
  • "Грязное" чтение
  • Неповторяющееся чтение
  • Фантомная вставка
Потерянное обновление может возникнуть в ситуации, когда две транзакции обновляют одни и те же данные. "Грязное" чтение возникает, когда одна транзакция видит несохранённые изменения, сделанные другой транзакцией. Неповторяющееся чтение - это ситуация, когда в рамках одной транзакции один и тот же запрос на выборку возвращает разные результаты. Фантомная вставка - ситуация, похожая на неповторяющее чтение - заключается в том, что результаты одной и той же выборки в рамках одной транзакции имеют разное количество возвращаемых строк. Стандарт SQL-92 определяет следующие уровни изоляции транзакции:
  1. READ_UNCOMMITED
  2. READ_COMMITED
  3. REPEATABLE_READ
  4. SERIALIZABLE
READ_UNCOMMITED - позволяет другим транзакциям видеть несохранённые изменения READ_COMMITED - транзакция во время выполенения видит только зафиксированные изменения. В большинстве баз данных это уровень изоляции по умолчанию. REPEATABLE_READ - данный уровень изоляции решает проблему неповторяющего чтения. SERIALIZABLE - данный уровень изоляции выполняет все транзакции последовательно. Это самый надёжный уровень изоляции, но, при этом, и наименее производительный. Каждый уровень решает часть вышеперечисленных проблем.
Проблема Уровень изоляции Потерянное обновление Грязное чтение Неповторяющееся чтение Фантомная вставка
READ_UNCOMMITED невозможно возможно возможно возможна
READ_COMMITED невозможно невозможно возможно возможна
REPEATABLE_READ невозможно невозможно невозможно возможна
SERIALIZABLE невозможно невозможно невозможно невозможна

22 April, 2009

Кратко о блокировках

Блокировка - в реляционных базах данных это установка метки на запись, что запись заблокирована для изменений. Существует два вида блокировок - оптимистичная и пессимистичная.

Оптимистичная блокировка

При оптимистичной блокировке на базе данных реальной блокировки не происходит. Вместо этого используется следующий подход - если во время выполнения транзакции она изменяет данные, которые были изменены после её начала, то транзакция прерывается с исключением. Использование оптимистичных блокировок позволяет избежать взаимных блокировок (dead-lock). Для реализации оптимистичной блокировки часто используется версионирование данных - в таблицу добавляется колонка, которая хранит текущую версию. При выполнении update в запросе в секции where передается версия данных, которая была забрана на изменение. Если update вернул 0 изменённых строк, значит данные были уже изменены и транзакцию необходимо запускать заново. Вместо версии можно хранить время последнего изменения данных.

Пессимистичная блокировка

При пессимистичной блокировке для записи ставится эксклюзивная блокировка на уровне базы данных, запрещая таким образом доступ к данным из других транзакций. Существует несколько видов пессимистичных блокировок:
  1. блокировка при чтении
  2. блокировка при записи
При блокировке при чтении запись блокируется когда она запрашивается из базы данных. Недостаток метода в том, что таким образом можно заблокировать даже те данные, которые не изменяются в рамках текущей транзакции. При блокировке при записи блокировка даных происходит при их обновлении в базе данных до конца текущей транзакции. Блокировка с данных снимается либо при коммите, либо при откате транзакции.

Сравнение оптимистичных и пессимистичных блокировок

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

21 April, 2009

Практический опыт использования фолксономии в условиях неограниченной свободы расстановки меток (часть 2)

В продолжение предыдущей заметки . Для работы с del.icio.us я использую официальный плагин от Yahoo!. Он предоставляет следующие возможности: 1. Синхронизация закладок из Firefox с del.icio.us 2. Переопределение стандартного менеджера закладок. 3. Отслеживание изменений на del.icio.us. 4. Интерфейс для отображения и поиска закладок в панели браузера. 5. Панель инструментов для работы с закладками. Из всех вышеперечисленных возможностей раньше пользовался только вторым пунктом. Это очень удобно - выделяешь на странице кусок текста и клацаешь ctrl+b. Появляется окошечко с уже заполненной ссылкой, заголовком и описанием ссылки. В поле описания попадает выделенный текст. После этого расставляешь метки и жмёшь кнопку save. Мне этого хватало и я был доволен. Недавно я для себя открыл следующую вещь - в панели инструментов Delicous Toolbar можно выбрать вид Favorites Tag Views и настроить избранные теги, которые будут отображаться на панели. Выглядит это следующим образом: При щелчке на тег показыватся список закладок, помеченных избранными тегами. Очень удобно.

19 April, 2009

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

Уже более двух лет я использую del.icio.us. Недавно возник вопрос - а вот каким образом можно наиболее эффективно использовать теги? Для себя я придумал вот такой вариант использования - сделал tag bundle Actions, в который поместил теги, диктующие дальнейшие действия. Для себя я выделил следующие теги: 2rss - закладки с этим тегом я позже добавляю в свою RSS-читалку. 2check - этим тегом я помечаю софт или библиотеки, которые хотелось бы изучить и попробовать на деле. 2read - статьи, которые нужно прочитать и/или изучить. 2download - то, что нужно скачать. Соответственно, после того, как я действие было выполнено, я удаляю тег действия и обновляю теги на странице (особенно для страниц, помеченных как 2read). Для себя я вынес следующие правила расстановки тегов: 1. Теги должны быть в одном числе. Я ставлю в единственном. Кому-то покажется, что лучше во множественном лучше, пусть. Главное - быть консистентным. 2. Теги нужно ставить понятные самому себе, а не те, что предлагает народ - пользоваться-то в первую очередь потом тегами придется мне, а не народу. 3. Расставлять не более 10 тегов на страницу, иначе релевантность тегов уменьшается. 4. Теги должны отражать содержимое страницы.