Za prvé, ve vaší implementaci je chyba. Pokud dojde k chybě dotazu, aktuální transakce se automaticky vrátí zpět a poté se zavře. Takže jak budete pokračovat v provádění dotazů, nebudou v rámci transakce (budou odevzdávány do DB). Poté, když spustíte Rollback
, tiše selže. Z dokumentů MySQL
:
Rolling back can be a slow operation that may occur implicitly without the user
having explicitly asked for it (for example, when an error occurs).
Explicitní příkaz ROLLBACK
by měl být použit pouze v případě, že v aplikaci určíte, že je třeba vrátit zpět (z jiných důvodů, než je chyba dotazu). Pokud například strháváte prostředky z účtu, výslovně byste se vrátili zpět, pokud byste zjistili, že uživatel nemá dostatek prostředků na dokončení výměny...
Pokud jde o testování transakcí, kopíruji databázi. Vytvořím novou databázi a nainstaluji sadu „dummy dat“. Poté spustím všechny testy pomocí automatizovaného nástroje. Nástroj skutečně potvrdí transakce a vynutí vrácení zpět a zkontroluje, zda je během testů zachován očekávaný stav databáze. Vzhledem k tomu, že je obtížnější programově znát koncový stav transakce, pokud máte k transakci neznámý vstup, nebude testování živých (nebo dokonce zkopírovaných dat ze živého vysílání) snadné. Můžete to udělat (a měli byste), ale nespoléhejte na tyto výsledky, abyste zjistili, zda váš systém funguje. Použijte tyto výsledky k vytvoření nových testovacích případů pro automatizovaného testera...