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

mysql - Zamykání řádků pro výběrový dotaz?

Nativní zamykání MySQL tuto funkci neposkytuje. Můžete použít sloupec k provedení svých "zámků".

Za předpokladu, že každé vlákno mělo jedinečné ID, můžete vytvořit sloupec s názvem thread_owner , s výchozí 0.

Jedno vlákno by zachytilo řádek jako tento:

UPDATE mytable
SET thread_owner = :my_threadID
WHERE thread_owner = 0
LIMIT 1

Poté vyberte řádek takto (může vrátit žádný, pokud nebyly žádné řádky ke zpracování):

SELECT *
FROM mytable
WHERE thread_owner = :my_threadID

Poté jej zpracujte a nakonec smažte.

Toto řešení by fungovalo na MyISAM i InnoDB.

V případě InnoDB to však může být pomalé, protože každý příkaz UPDATE se pokouší uzamknout všechny řádky, kde vlastník_vlákna =0, a pokud si nejste jisti, že pokaždé zamykáte všechny řádky ve stejném pořadí, může to dokonce způsobit uváznutí. Můžete tedy zkusit explicitně zamknout celou tabulku v příkazu UPDATE:

LOCK TABLES mytable WRITE;
UPDATE mytable
SET thread_owner = :my_threadID
WHERE thread_owner = 0
LIMIT 1;
UNLOCK TABLES;

Tímto způsobem budou MyISAM i InnoDB fungovat stejným způsobem.



  1. Odvoďte nová pole, která přenášejí počty pro každý záznam

  2. Dapper Oracle Number(10,0) je vráceno jako chyba Decimal Parser

  3. Jaký je rozdíl mezi MySQLdb, mysqlclient a MySQL konektorem/Pythonem?

  4. Jak mohu shrnout data ve stromové struktuře v SQL od dětí po rodiče?