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

jak zamknout některý řádek, protože v jiné transakci nejsou vybrány

Zní to, jako byste potřebovali nějakou formu značky k identifikaci řádků jako „používaných“, takže ostatní instance nezpracovávají stejná data; nezáleží na tom, zda použijete typ boolean nebo datum, nějakým způsobem musíte označit používané řádky.

Můžete to udělat buď prostřednictvím dispečera, procesu nebo vlákna s jediným přístupem k vaší tabulce a kdo má jedinou práci, vybrat řádky a předat je dalším procesům, na kterých budou pracovat. I v takovém případě bude muset dispečer vědět, jak daleko má data k dispozici, abyste se vrátili ke stejnému problému.

Dalším způsobem je použít pole k označení řádku, který se používá (jak jste uvedli ve své otázce). Každý proces aktualizuje blok řádků s jedinečným ID, provedené uvnitř transakce k uzamčení tabulky; Použil bych číslo připojení vrácené z CONNECTION_ID() abyste je označili, pak víte, že je jedinečný.

Po UPDATE ... WHERE connection_id IS NULL (s aplikovaným limitem) transakce je dokončena proces může SELECT ... WHERE connection_id = CONNECTION_ID() získat jejich řádky ke zpracování.

Když dokončí svou práci, celý cyklus začne znovu, aby se označila další sada řádků, dokud nebudou všechny zpracovány.




  1. Proč tento dotaz nefunguje tak, jak jsem očekával?

  2. PostgreSQL:Fulltextové vyhledávání - Jak hledat dílčí slova?

  3. Jak vložit pandas DataFrame do tabulky Microsoft SQL Server?

  4. Jak zachytit chyby DB v CodeIgniter PHP