Podręcznik użytkownika CodeIgniter wersja 2.2.1


Transakcje

CodeIgniter pozwala na używanie transakcji dla baz danych, których typy tabel wspierają transakcje. W MySQL będziesz musiał używać tabel typu InnoDB lub BDB, a nie bardziej powszechnych MyISAM. Większość innych platform bazodanowych wspiera transakcje natywnie.

Jeśli nie jesteś zaznajomiony z transakcjami, zalecamy abyś znalazł dobre źródło online i poznał transakcje w kontekście bazy danych, której używasz. Informacje przedstawione poniżej, zakładają, że masz podstawową wiedzę związaną z transakcjami.

Podejście do transakcji w CodeIgniterze

CodeIgniter wykorzystuje podejście do transakcji, które jest bardzo podobne do tego stosowanego w popularnej klasie bazodanowej ADODB. Wybraliśmy to podejście ponieważ bardzo upraszcza proces stosowania transakcji. W większości przypadków, wszystko czego potrzebujemy, to dwie linijki kodu.

Zwyczajowo, implementacja transakcji wymaga od nas sporych nakładów pracy, ponieważ wymagane jest śledzenie zapytań i zależnie od ich wyniku, wykonanie operacji commit lub rollback. Jest to szczególnie uciążliwe jeśli mamy do czynienia z zagnieżdżonymi zapytaniami. Nam udało się zaimplementować mądry system transakcji, który całą tę pracę wykonuje za Ciebie automatycznie (możesz również zarządzać transakcjami ręcznie jeśli chcesz, ale właściwie nie niesie to za sobą żadnych dodatkowych korzyści).

Uruchamianie transakcji

Aby wykonywać zapytania używając transakcji, musisz użyć funkcji $this->db->trans_start() i $this->db->trans_complete(), jak pokazano poniżej:

$this->db->trans_start();
$this->db->query('PIERWSZE ZAPYTANIE...');
$this->db->query('KOLEJNE ZAPYTANIE...');
$this->db->query('I JESZCZE JEDNO ZAPYTANIE...');
$this->db->trans_complete();

Pomiędzy funkcjami start/complete, możesz uruchomić tak wiele zapytań, ile tylko chcesz - zostaną one zatwierdzone lub cofnięte na podstawie sukcesu lub porażki wykonywanych zapytań.

Strict Mode

Domyślnie CodeIgniter uruchamia wszystkie transakcje w trybie Strict Mode. Kiedy ten tryb jest włączony i uruchamiasz wiele grup transakcji, a jedna z tych grup zakończy się porażką - transakcje dla wszystkich grupy zostaną cofnięte. Jeśli tryb strict mode jest wyłączony, każda z grup jest traktowana oddzielnie, co oznacza, że porażka jednej z grup je wpłynie na inne.

Strict Mode może zostać wyłączony w ten sposób:

$this->db->trans_strict(FALSE);

Zarządzanie błędami

Jeśli masz włączone raportowanie błędów w pliku config/database.php, zobaczysz standardowe wiadomości o błędzie, jeśli transakcja zakończy się niepowodzeniem. Jeśli debugowanie jest wyłączone, możesz zarządzać własnymi błędami w ten sposób:

$this->db->trans_start();
$this->db->query('ZAPYTANIE...');
$this->db->query('KOLEJNE ZAPYTANIE...');
$this->db->trans_complete();

if ($this->db->trans_status() === FALSE)
{
    // zwróć błąd... lub użyj funkcji log_message() aby umieścić błąd w logu
}

Uruchamianie transakcji

Transakcje są uruchamiane automatycznie, w momencie użycia $this->db->trans_start(). Jeśli chcesz zakończyć transakcję, możesz to zrobić za pomocą $this->db->trans_off():

$this->db->trans_off()

$this->db->trans_start();
$this->db->query('ZAPYTANIE...');
$this->db->trans_complete();

Kiedy transakcje są wyłączone, Twoje zapytania będą automatycznie zatwierdzane, dokładnie w taki sam sposób, jak kiedy uruchamiasz je bez transakcji.

Tryb testowy

Opcjonalnie możesz włączyć transakcje w trybie testowym, co spowoduje że Twoje zapytania będą cofane -- nawet wtedy, gdy są wykonywane poprawnie. Aby skorzystać z trybu testowego, wystarczy ustawić pierwszy parametr w funkcji $this->db->trans_start() na TRUE:

$this->db->trans_start(TRUE); // zapytanie zostanie cofnięte
$this->db->query('ZAPYTANIE...');
$this->db->trans_complete();

Manualne uruchamianie transakcji

Jeśli chciałbyś uruchomić transakcje ręcznie, możesz to zrobić w następujący sposób:

$this->db->trans_begin();

$this->db->query('ZAPYTANIE...');
$this->db->query('KOLEJNE ZAPYTANIE...');
$this->db->query('JESZCZE JEDNO ZAPYTANIE...');

if ($this->db->trans_status() === FALSE)
{
    $this->db->trans_rollback();
}
else
{
    $this->db->trans_commit();
}

Uwaga: Kiedy ręcznie uruchamiasz transakcje, upewnij się, że używasz funkcji $this->db->trans_begin() a NIE $this->db->trans_start().