V jaké vrstvě voláte commit? rubrika: Programování: Python
Ahoj,
zajímal by mě váš názor na správné umístění potvrzování/rollbackování transakcí.
V práci commit/rollback voláme ve view, např.:
def delete_file(file_id): u""" Smazání souboru. """ flask.g.model.file.delete(file_id) flask.g.db.commit() return flask.jsonify(info=u'Soubor úspěšně smazán')
Přemýšlím, jestli je to správná technika, případně jak moc je špatná :)
Otázky k zamyšlení:
- měla by/může webovka vědět, že se používá nějaká persistence?
- není commit ve view zanášením business logiky do view?
Díky za názory
V MVC musí být transakce schované za API modelu tj. uvnitř toho M. Důvod je jednoduchý - klidně může přijít požadavek, aby k danému danému M přibylo ještě jiné VC (třeba kromě webového rozhraní, ještě SMS rozhraní). A duplikovat kód v případě více view nebo kontrolerů určitě nikdo nechce.
Kde konkrétně v Modelu to je záleží na tom jaká je technologie modelu. Pokud je to OOP tak je to v objektech. Pokud je API modelu rozhraním databáze tak v db. Oba přístupy najednou v jedné aplikaci se moc kombinovat nedají aby nevznikly "vnořené transakce".
Zajímavé problémy vznikají pokud je rozhraním aplikace db, ale část dat je v FS a chceme transakční zpracování. Typicky třeba "při smazání záznamu z tabulky Firmy smaž všechny dokumenty začínající jejím id z adresáře /DOC/, samozřejmě transakčně tj. pokud se smazání firmy nepovede tak tam dokumenty musí zůstat". To se řeší insertováním "příkazů které mají udělat nad FS" uvnitř transakce. A pokud je transakce rollbackovaná tak se zrollbackují i tyto příkazy.
PS: Cituji sám sebe z http://devel.cz/otazka/v-mvc-maji-byt-transakce-na-jake-urovni kde se vlastně toto už řešilo.
Pro zobrazení všech 5 odpovědí se prosím přihlaste:
Nebo se přihlaste jménem a heslem:
Komentáře