sql >> Database >  >> RDS >> Oracle

Hoe te voorkomen dat twee verschillende threads dezelfde rijen uit DB lezen (Hibernate en Oracle 10g)

U moet PESSIMISTIC_WRITE . gebruiken op het moment van de vraag:

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

Het vergrendelen van de bovenliggende objecten is voldoende. Deadlocks zullen niet noodzakelijkerwijs optreden. U kunt een fout krijgen bij het verwerven van een vergrendeling als de thread die de vergrendeling vasthoudt, deze niet vrijgeeft voordat een andere thread een time-out krijgt tijdens het wachten.

Aangezien u Oracle gebruikt, is dit hoe KIES VOOR UPDATE werkt:

Dus als T1 een exclusieve vergrendeling op sommige rijen heeft gekregen, kan T2 die records niet lezen totdat T1 zich commit of terugdraait. Als T2 een READ_UNCOMMITTED gebruikte isolatieniveau, dan blokkeert T2 nooit vergrendelingsrecords, omdat het gewoon logs voor ongedaan maken gebruikt om gegevens te reconstrueren alsof het was toen de query begon. In tegenstelling tot de SQL-standaard, zal de Oracle READ_UNCOMMITTED:




  1. Examen met tips en hints voor Azure SQL Database-beheer (DP-300)

  2. PDO doorlussen en fetchAll afdrukken

  3. Oracle Cloud:een database voor autonome transactieverwerking (ATP) maken

  4. sql-server datetime naar een andere tijdzone converteren?