sql >> Databáze >  >> RDS >> Oracle

Jak zabránit tomu, aby dvě různá vlákna četla stejné řádky z DB (Hibernate a Oracle 10g)

Musíte použít PESSIMISTIC_WRITE v době dotazu:

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

Uzamčení nadřazených objektů je dostatečné. K uváznutí nemusí nutně dojít. Pokud vlákno držící zámek neuvolní zámek dříve, než vyprší časový limit čekání, může dojít k selhání akvizice zámku.

Protože používáte Oracle, takto VYBRAT PRO AKTUALIZACI funguje:

Takže pokud T1 získal exkluzivní zámek na některých řádcích, T2 nebude moci číst tyto záznamy, dokud T1 neprovede potvrzení nebo vrácení zpět. Pokud T2 použil READ_UNCOMMITTED úroveň izolace, pak T2 nikdy nebude blokovat záznamy o zámku, protože jednoduše používá protokoly zpět k rekonstrukci dat, jako by to bylo v době, kdy dotaz začal. Na rozdíl od standardu SQL bude Oracle READ_UNCOMMITTED:




  1. Ukládání EXIF ​​informací do databáze

  2. Chyba hibernace:Pro odkazovanou tabulku neexistuje žádný primární klíč

  3. Node-mysql vložit dotaz se dvěma hodnotami?

  4. Výběr polí v pěkně vytištěném formátu v SQL