Oracle
 sql >> Datenbank >  >> RDS >> Oracle

So vermeiden Sie, dass zwei verschiedene Threads dieselben Zeilen aus der DB lesen (Hibernate und Oracle 10g)

Sie müssen PESSIMISTIC_WRITE verwenden zur Abfragezeit:

Query q = session
    .createQuery("from MyObject n where n.state = 'NEW'")
    .setLockOptions(new LockOptions(LockMode.PESSIMISTIC_WRITE));
List<MyObject> list = (List<MyObject>) q.list();

Das Sperren der übergeordneten Objekte ist ausreichend. Deadlocks treten nicht unbedingt auf. Sie erhalten möglicherweise einen Fehler beim Abrufen der Sperre, wenn der Thread, der die Sperre hält, sie nicht freigibt, bevor ein anderer Thread das Zeitlimit für das Warten verliert.

Da Sie Oracle verwenden, gilt Folgendes: ZUR AKTUALISIERUNG AUSWÄHLEN funktioniert:

Wenn also T1 eine exklusive Sperre für einige Zeilen erworben hat, kann T2 diese Datensätze nicht lesen, bis T1 einen Commit oder Rollback durchführt. Wenn T2 einen READ_UNCOMMITTED verwendet hat Isolationsstufe, dann blockiert T2 niemals Sperrdatensätze, da es einfach Rückgängig-Protokolle verwendet, um Daten so zu rekonstruieren, als ob sie zu Beginn der Abfrage gewesen wären. Im Gegensatz zum SQL-Standard wird Oracle READ_UNCOMMITTED: