Okamžik pádu transakce rubrika: Databáze: SQL

9 Taco
položil/-a 7.9.2017

Mám dvě databáze MySQL a dvě transakce.

Provedu řadu kroků, řadu změn. Pak zavolám commit na každé z nich. A ono mi to chcípne až v tom okamžiku commitu. To znamená, že nejsem schopen zajistit atomicitu těchto dvou databází.

Nevíte někdo jak na to?

Děkuji.

Komentáře

  • rmaslo : A proč to v tom commitu chcípne? 7.9.2017
  • Taco : To teprve zjišťuju. A simulaci jsem si zatím nedělal. 7.9.2017
odkaz
4 KamilZ
odpověděl/-a 7.9.2017
 
upravil/-a 7.9.2017

Nastuduj si problematiku dvou fázového commitu (Two-Phase Commit)

Nepíšeš, co máš nad tím za aplikační vrstvu, ale například .NET na to je TransactionScope:

using (var scope = new TransactionScope())
{
    using (var conn1 = new SqlConnection(connStrDb1))
    {
        conn1.Open();
        SqlCommand cmd1 = conn1.CreateCommand();
        cmd1.CommandText = string.Format("insert into T1 values(1)");
        cmd1.ExecuteNonQuery();
    }
 
    using (var conn2 = new SqlConnection(connStrDb2))
    {
        conn2.Open();
        var cmd2 = conn2.CreateCommand();
        cmd2.CommandText = string.Format("insert into T2 values(2)");
        cmd2.ExecuteNonQuery();
    }
 
    scope.Complete();
}

Nebo lze použít něco jako Distributed Transaction Coordinator (DTC)

Co se týká MySQL, tak se podívej na XA Transactions a tuto prezentaci.

Komentáře

  • Taco : Žádná zajímavá aplikační vrstva nad tím není. Respektive můžu si tam napsat co potřebuju. Momentálně jsem čistě na úrovni dvou sql-connection. ___ To .NETácké TransactionScope neznám. Co dělá Complete? ___ Problematiku dvoufázové commitu chápu. Pokud selže jakoliv query uvnitř transakce, tak to si umím poradit. Jen mě trochu vypeklo, že to může selhat až v commitu. To pak nevím jak zajistit rollbacknutí commitnuté transakce. Ale možná mi něco uniká. 7.9.2017
  • pavel.stehule : @Taco: COMMIT může selhat z několika důvodů - na vyšších úrovních izolace transakcí naprosto běžně. Řešením je 2PC commit, kde se může udělat COMMIT "nanečisto", který jde ještě rollbacknout. Bez 2PC commitu se to nedá udělat. 8.9.2017
  • Taco : Princip 2PC je mi z logiky věci jasný. ___ Koukal jsem na to XA transactions. A nedovedu si představit, jak bych to implementoval do našeho prostředí. Předpokládám, že nějaké snadné řešení (bez těchto rozšíření, a překopání celé db vrtsvy) neexistuje :-( 8.9.2017

Pro plný přístup na Devel.cz 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.