sql >> Databasteknik >  >> RDS >> Oracle

Hur man undviker två olika trådar läser samma rader från DB (Hibernate och Oracle 10g)

Du måste använda PESSIMISTIC_WRITE vid frågetid:

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

Det räcker med att låsa föräldraobjekten. Deadlocks kommer inte nödvändigtvis att inträffa. Du kan få ett låsförvärvningsfel om tråden som håller låset inte släpper den innan en annan tråd tar slut i väntan.

Eftersom du använder Oracle är det så här VÄLJ FÖR UPPDATERING fungerar:

Så om T1 fick ett exklusivt lås på vissa rader, kommer T2 inte att kunna läsa dessa poster förrän T1 commits eller återställs. Om T2 använde en READ_UNCOMMITTED isoleringsnivå, då kommer T2 aldrig att blockera låsposter, eftersom den helt enkelt använder ångra loggar för att rekonstruera data som om det var när frågan började. Till skillnad från SQL-standarden kommer Oracle READ_UNCOMMITTED:




  1. Alfanumeriskt skiftläge okänslig sortering i postgres

  2. Använd SQL nyckelord som alias för en kolumn

  3. Dynamisk UNION ALL-fråga i Postgres

  4. MySQL satt AUTO_INCREMENT-värdet till MAX(id) + 1 genväg?