Folgendes Verhalten musste ich eben mit SHOW FULL PROCESSLIST; unter mysql feststellen und wundere mich darueber:
Waehrend ein Select ueber die Gesamtliste der Datensaetze durchgefuehrt wurde (State sorting result), waren alle anderen Selects die nur einen einzigen Datensatz selektieren im State "locked". Wieso das denn? Wenn alle nur lesen?
OK, mal ein Beispiel. Die folgenden werden alle gelocked:
| 144 | name | localhost | usrdb_name | Query | 0 | Locked | SELECT id, domain, ... FROM tblName WHERE short='hase.de' AND active=1
Dazu ist lediglich folgendes noetig, entweder im state "sort result" oder "sending data", dies locked IMMER die SELECTs wie oben genannt:
| 256 | name | localhost | usrdb_name | Query | 0 | Sending data | SELECT domain .. , [Formel aus Potenzen, Euler, TimestampUmrechnungen hier, muss leider geheim gehalten werden, Grund bekannt] AS points FROM tblName WHERE active=1 AND [geheim] ORDER BY points DESC, pr DESC |
Namen geaendert, warum bekannt Es ist beides mal die gleiche Tabelle auf die zugegriffen wird, aber eben nur SELECTs, kein einziges INSERT oder UPDATE ist dabei!
sorry, um es wirklich nachzuvollziehen ist der aufwand zu groß. aber:
wenn du ein Sortierung machst, dann will doch die SQL-DB wohl sicherstellen, dass sich während des Sortiervorganges nicht mal die Werte der zu sortienden Felder ändern??? Also müssen die zu sortierenden Datensätze gelockt werden.
Das mag zwar sein. Aber wenn alle Zugriffe rein LESEND sind (nur SELECTs, keine INSERTs oder UPDATEs - hab es zigmal ueberprueft) ist das Locken nur fuer die Sortierung ja voellig unnoetig, denn es kann sich ja nix aendern. Ein exclusives Lock wird wohl erst dann noetig wenn es ein INSERT oder ein UPDATE Query gibt, dann macht es auch wirklich Sinn.