Hallo,
weiss jemand eine Lösung für folgendes Problem ?
Ich habe eine Tabelle, mit sehr vielen Lesezugriffen und wenige-mittlere Anzahl Schreibzugriffe. Unter Hochlast bekommen die Schreibzugriffe einen Timeout-Fehler.
Nachdem ich die IsolationLevel- und LockMode-Einstellungen überprüft habe, habe ich folgendes festgestellt:
* die Transaktionen habe default-mäßig immer IsolationLevel. ReadCommitted, was ich auch eine vernünftige Einstellung finde
* der LockMode der Session wird sobald ein "select" in irgendeiner Form auftaucht automatisch auf "Read" Lock gesetzt.
Der "Read"-Lock hat den Nachteil, dass die jeweiligen Elemente für das Ändern gesperrt sind und zwar solange bis keine Leseanfrage mehr kommt, die Lesesperre weggenommen wird und dann geschrieben werden kann.
Jetzt ist es aber so, dass bei den sehr vielen Lesezugriffen der Zustand "keine Leseanfrage mehr vorhanden" nicht auftritt, die Sperre nicht weggenommen wird und die Schreibzugriffe ewig warten, bis sie von der Datenbank mit Timeout-Fehler abgebrochen werden.
Jetzt habe ich versucht, der Query bzw. der Session ein LockMode.None mitzugeben, damit die Lesesperre nicht gesetzt wird und das Lesen nur über den IsolationLevel gehandhabt wird. Leider ignoriert Hibernate diese Einstellung und setzt den LockMode automatisch auf "Read" und mein Problem bleibt bestehen.
Weiss jemand, wie ich Hibernate bei Abfragen den LockMode.Read abgewöhnen kann ? Oder verstehe ich grundsätzlich was falsch und muss die Sache ganz anders angehen ?
Für eure Hilfe wäre ich dankbar.
Nicole
|