sql >> Databáze >  >> RDS >> Mysql

Nejlepší způsob, jak řešit problémy se souběžností

Donnieho odpověď (dotazování) je pravděpodobně vaše nejlepší volba – jednoduchá a funguje. Pokryje téměř každý případ (je nepravděpodobné, že by jednoduché vyhledávání PK uškodilo výkonu, a to i na velmi oblíbeném webu).

Pro úplnost, a pokud jste se chtěli vyhnout hlasování, můžete použít push-model . V článku na Wikipedii jsou popsány různé způsoby. Pokud můžete udržovat mezipaměť pro zápis (pokaždé, když aktualizujete záznam, aktualizujete mezipaměť), můžete téměř úplně eliminovat zatížení databáze.

Nepoužívejte však sloupec „last_updated“ s časovým razítkem. Úpravy během jedné sekundy nejsou neslýchané. Můžete se toho zbavit, pokud přidáte další informace (server, který provedl aktualizaci, vzdálenou adresu, port atd.), abyste zajistili, že pokud přijdou dva požadavky ve stejnou sekundu na stejný server, můžete zjistit rozdíl. Pokud však tuto přesnost potřebujete, můžete také použít jedinečné pole revize (nemusí to být nutně rostoucí celé číslo, pouze jedinečné v rámci životnosti daného záznamu).

Někdo zmínil trvalá připojení – to by snížilo náklady na nastavení dotazovacích dotazů (každé připojení přirozeně spotřebovává zdroje na databázi a hostitelském počítači). Ponechali byste jedno připojení (nebo co nejméně) otevřené po celou dobu (nebo tak dlouho, jak je to možné) a používali byste ho (v případě potřeby v kombinaci s ukládáním do mezipaměti a ukládáním do paměti).

Konečně jsou zde příkazy SQL, které umožňují přidat podmínku na UPDATE nebo INSERT. Můj SQL opravdu reziví, ale myslím, že je to něco jako UPDATE ... WHERE ... . Abyste dosáhli této úrovně ochrany, museli byste před odesláním aktualizace provést vlastní zamykání řádků (a veškeré zpracování chyb a čištění, které může vyžadovat). Je nepravděpodobné, že byste to potřebovali; Zmiňuji to jen pro úplnost.

Upravit:

Vaše řešení zní dobře (časová razítka mezipaměti, požadavky proxy dotazování na jiný server). Jedinou změnou, kterou bych udělal, je aktualizovat časová razítka uložená v mezipaměti při každém uložení. Tím bude mezipaměť čerstvější. Při ukládání bych také zkontroloval časové razítko přímo z databáze, abych zabránil propašování ukládání kvůli zastaralým datům mezipaměti.

Pokud používáte APC pro ukládání do mezipaměti, pak druhý HTTP server nedává smysl - museli byste ho spustit na stejném počítači (APC používá sdílenou paměť). Stejný fyzický stroj by dělal práci, ale s dodatečnou režií druhého HTTP serveru. Pokud chcete vypnout načítání požadavků dotazování na druhý server (ve vašem případě lighttpd), pak by bylo lepší nastavit lightttpd před Apache na druhém fyzickém počítači a použít sdílený mezipaměťový server (memcache), aby server lighttpd může číst časová razítka v mezipaměti a Apache může aktualizovat časová razítka v mezipaměti. Důvodem pro umístění lighttpd před Apache je, pokud většina požadavků jsou požadavky na dotazování, vyhnout se použití těžšího procesu Apache.

Pravděpodobně vůbec nepotřebujete druhý server, opravdu. Apache by měl být schopen zpracovat další požadavky. Pokud to nejde, pak bych přehodnotil vaši konfiguraci (konkrétně direktivy, které řídí, kolik pracovních procesů spouštíte a kolik požadavků mohou zpracovat, než budou zabity).



  1. Top-N dotazy a stránkování v Oracle

  2. Přejmenování sloupců cizího klíče v MySQL

  3. Oracle ODP.Net a EF CodeFirst – chyba SaveChanges

  4. Jak funguje SCHEMA_ID() v SQL Server