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.
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:
Nebo se přihlaste jménem a heslem:
Komentáře