sql >> Database teknologi >  >> RDS >> Oracle

Sådan undgår du to forskellige tråde, læs de samme rækker fra DB (Hibernate og Oracle 10g)

Du skal bruge PESSIMISTIC_WRITE på forespørgselstidspunktet:

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 er tilstrækkeligt at låse de overordnede objekter. Deadlocks vil ikke nødvendigvis forekomme. Du kan få en låseoptagelsesfejl, hvis tråden, der holder låsen, ikke frigiver den før en anden tråd udløber ventetiden.

Da du bruger Oracle, er det sådan VÆLG FOR OPDATERING virker:

Så hvis T1 erhvervede en eksklusiv lås på nogle rækker, vil T2 ikke være i stand til at læse disse poster, før T1 begår eller ruller tilbage. Hvis T2 brugte en READ_UNCOMMITTED isolationsniveau, så vil T2 aldrig blokere for låseposter, da den simpelthen bruger fortryd-logfiler til at rekonstruere data, som om de var, da forespørgslen begyndte. I modsætning til SQL-standarden vil Oracle READ_UNCOMMITTED:




  1. Hvad er null-tegnet bogstaveligt i TSQL?

  2. griber kun første række i en mysql-forespørgsel

  3. Sådan bruger du parameter med LIKE i SQL Server Compact Edition

  4. PostgreSQL:indsæt fra en anden tabel