Базы данных. Транзакции.

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

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

1. Шаблон проектирования Singleton (одиночка).

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

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

<?php
class DataBase {
private function __construct($dsn = null) {
     this->conn = DB::connect($dsn);
}
static public function instance() {
     static $objDB;
     if(!isset($objDB)) {
         $objDB = new DataBase();
     }
     return $objDB;}
}
?>

В кратце поясню этот наглядный пример. Путем объявления функции __construct() – private, мы закрываем доступ к ней извне класса. Единственный способ которым можно создать объект этого класса является статический вызов функции DataBase::instance(), которая в свое время проверит, существует ли объект этого класса, и если несуществует, то создаст новый. Открыл для себя маленький хак :-)

2. Транзакции

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

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

А зачем использовать транзакции? Вижу в этом несколько плюсов:

  1. Будем использовать тогда, когда нам крайне важно, чтобы нынешние изменения базы были успешно выполнены, иначе предыдущие изменения не имеют смысла или же даже опасны. Как пример: если в рамках одной функции вносятся изменения в несколько таблиц, то использование транзакции не позволит нарушиться целостности ссылок.
  2. Удобно создавать этакие сэйвпоинты, а потом одним махом делать подтверждение или же откат до какой-либо из точек сохранения;
  3. И конечно же важное: принцип невмешательства. Если вы все же намудрили при редактировании баз, то это никак не отразится на других пользователях системы, которые работают с этой базой данных, до тех пор пока вы не подтвердите свои ошибочные действия.

Современные версии популярных СУБД такие как MySQL, PostgreSQL, Oracle, MSSQL Server поддерживают транзакции.

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

One response to “Базы данных. Транзакции.

  1. обязательно перечитаю,ежели вздумаю этим когда-то заняться-))

Leave a comment