MySQL InnoDB: Deadlockproblem ( Multi-Row-Update soll nicht alle rows locken )

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • MySQL InnoDB: Deadlockproblem ( Multi-Row-Update soll nicht alle rows locken )

    Moin Leute,

    ich habe ein Query der Art:

    Code:
    UPDATE users u
                        SET u.technology_score = u.technology_score +
                        (
                          SELECT SUM(p.technology_score_production * (#{now} - u.last_tick_tech) / 3600)
                          FROM  planets p
                          WHERE p.user_id = u.id
                        ),
                        u.last_tick_tech = #{now}
    In Verbindung mit den anderen Queries die im Betrieb auf diesen beiden Tabellen einhacken führt das zu merkwürdigen Deadlocks.

    Ein SHOW ENGINE INNODB STATUS sagt mir da unter anderem:

    376 lock struct(s), heap size 27968, 4314 row lock(s), undo log entries 1062
    Das bedeutet, dass sämtliche Zeilen der beiden Tabellen gelockt werden.

    Kann ich das irgendwie feingranularer machen ? Ich möchte, dass immer nur eine Zeile gelockt wird, nämlich die, die gerade geupdated wird. Geht das ?

    Danke.
    Mein aktuelles Projekt: Hausaufgaben Datenbank für kostenlose Hausaufgaben

  • #2
    Was mich interessiert - wie hast du die Query abgesetzt.

    Damit meine ich z.B. über PDO begintransaction usw. . oder wie ?

    Kommentar


    • #3
      Ne, mit dem ActiveRecord-Framework von Ruby on Rails, aber abgesehen davon braucht man ein einzelnes Statement aber meines Wissens nach nicht als Transaktion durchzuführen, da es ohnehin atomar ausgeführt wird. Oder seh ich das falsch ?

      Hat sich mitlerweile aber erledigt, habe auf dem Server das Table-Locking von InnoDB deaktiviert und die wartezeit für eine Transaktion auf einen Lock auf 1 Sekunde gestellt ( WTF wieso zum Teufel stand das auf 50 ? ).
      Mein aktuelles Projekt: Hausaufgaben Datenbank für kostenlose Hausaufgaben

      Kommentar

      Lädt...
      X