Portál AbcLinuxu, 7. května 2025 20:42
Problém je ten, že všechny body musí vidět stejná data. Body 2 a 3 mohou trvat několik minut, takže nepřichází v úvahu běh v transakci. Ta by mi kvůli konkurenčnímu použití aplikace málokdy doběhla do konce. Nechci nijak zamykat řádky, chci jen po dobu sql spojení "snapshot" stavu několika tabulek. V transakci bych zpracovával jen něco v bodu 3.
Původně jsem myslel, že bych "vnořoval" transakce (SAVEPOINT), nicméně pokud by ta podtransakce v bodu 3 něco zamykala, tak by mohla zhavarovat ta "rodičovská" transakce v jiném spojení. Jediné současné řešení, které mě napadá je manuálně si verzovat řádky vybraných tabulek. Je ještě jiná možnost? Ideálně něco jako "rodičovská" transakce, které by nikdy nedělala rollback "dceřiných".
Ověřit si, že běžíte nad InnoDB, které zamyká po řádcíchAno, všude je InnoDB. Ale čeká to na dokončení celé transakce. Dávka jde sekvenčně produkt po produktu, u každého produktu udělá dotazy do několika tabulek a několik tabulek aktualizuje. Transakce tam je začatá úplně primitivně na začátku celé dávky, takže pokud dojde k chybě neaktualizuje se žádný produkt. Asi by stačilo transakci otevřít a pak komitnout pro každý produkt zvlášť, takže by byla zaručena alespoň konzistence jednotlivého produktu. Musel bych prostudovat, jaké tam jsou vedlejší efekty - kvůli něčemu jsme transakce po produktech zamítli.
Dalším řešením může být separátní uložiště pro odeslání košíku - i při UPDATE se může z tabulky číst.Tomuhle nerozumím, můžete to prosím ještě rozvést?
(...) během několika minut měl zaktualizovat několik miliónů produktů. To skutečně děláte? Pokud ne, tak je docela dost možné, že ta dávku bude možné napsat inteligentněji.Ta dávka není čisté sql, používá se orm a řeší se tam kde co, mimo jiné se rozhoduje podle existujících záznamů v databázi. Přepis do sql s případným použitím procedur by bylo ideální, nicméně nejdražšší řešení.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.