Novinky v Nette Database 3.1
S elegantním způsobem práce s transakcí přichází nová metoda
transaction()
. Předáme jí callback, který se spustí
v transakci. Pokud při běhu dojde k vyhození jakékoliv výjimky, transakce
se zahodí (rollback). Pokud vše proběhne v pořádku, transakce se potvrdí
(commit).
Metoda Connection::transaction()
vrací hodnotu vrácenou
callbackem, můžeme si tak třeba předat insert id:
$id = $db->transaction(function ($db) {
$db->query('DELETE FROM ...');
$db->query('INSERT INTO ...');
$id = $db->getInsertId();
$this->savePerson(...);
// ...
return $id;
});
Volání transaction()
může být i zanořeno, což
zjednodušuje implementaci nezávislých celků. Tedy zmíněná metoda
savePerson()
může vypadat takto:
public function savePerson($data)
{
$this->db->transaction(function () {
$this->saveAddresses(...);
...
});
}
Srozumitelnost
Protože pro součást knihovny umožňující snadný objektový přístup
k databázi se vžil název Database Explorer, tak
i základní třída Nette\Database\Context
mění název na
Nette\Database\Explorer
. Dále Nette postupně opouští předponu
I
v názvech rozhraní, což se týká i knihovny Database.
Samozřejmě nadále fungují původní názvy jako aliasy.
Další změny
- Translátor SQL příkazů, což je srdce celé knihovny, je o něco opatrnější a více kontroluje vstupy.
- Driver MySqlDriver používá subqueries.
- Minimální požadovaná verze PHP je 7.2.
Komentáře
Doce by mě zajímalo, proč to $database předáváš v use a ne přímo jako parametr funkce. Když si tam takto vrazím instanci jiné connection, tak to moc transakční nebude ;)
Jak si na tom příkladu chytím třeba to, že došlo k rollbacku a já si budu chtít udělat třeba nějakej custom log? A jak zjistím, že došlo ke commitu bez chyby? Tím, že mi to vrátí nějaké číslo jako idéčko například nebo jinou návratovou hodnotu například true? Řekněme, že pokud nedojde k rollbacku na uvedeném příkladu, tak chci redirect na adresu právě s tím id co to vrátí. To bych udělal jak (asi to vyplyny z první otázky jak chytit rollback pro nějakou custom operaci)? Děkuji za doplnění.
#2 ViPEr*CZ* Když dojde k výjimce během transakce, tak se transakce rollbackne a vzápětí se daná výjimka znovu vyhodí, podívej se do kódu: https://github.com/…nnection.php#L174
@uestla jo super moooc díky. (určitě bych to taky našel… raději tedy v nějaké dokumentaci než koukat do zdrojáků … ale tohle určitě bude na API… ještě jednou díky )
V dokumentaci to samozřejmě je, ale pokud to není srozumitelné, což je klidně možné, pošli prosím PR.
Chcete-li odeslat komentář, přihlaste se