V jaké vrstvě voláte commit? rubrika: Programování: Python

6 danielmilde
položil/-a 25.11.2015
 
upravil/-a 25.11.2015

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

odkaz Vyřešeno
8 rmaslo
odpověděl/-a 25.11.2015

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.

Komentáře

  • Taco : Já sem teda s vnořenými transakcemi nikdy problém neměl. 26.11.2015

Pro zobrazení všech 5 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.