Jeg kan bekræfte denne observation. Jeg har testet flere Lock-Modes med en H2-database, og alle fungerede som forventet. Ingen af de pessimistiske Lock-Modes fungerede korrekt i kombination med en Oracle-database. Derfor er spørgsmålet:hvad er der galt med denne kode?
Med Oracle giver to af disse samtidige kodeudførelser de samme data, selvom den første bør blokere den anden:
// Hver tråd får sin egen Hibernate session:final Session session =HibernateSessionHolder.get();session.getTransaction().begin();final List eddList =session.createCriteria(EventDeliveryDataDB.class ) .setLockMode(LockMode.PESSIMISTIC_WRITE) // med LÆS den samme .add(eq("fremskridt", NEW)) .list();eddList.stream().forEach(eddElem -> eddElem.setProgress(IN_PROGRESS)); session.getTransaction().commit();
Dvalelog:
meget , this_.MAX_RETRIES as MAX_RETRIES8_2_0_, this_.PROGRESS as PROGRESS9_2_0_, this_.PROGRESS_ID as PROGRESS_ID10_2_0_, this_.RECIPIENT_CRID as RECIPIENT_CRID11_2_0_, this_.RETRY_COUNTER as RETRY_COUNTER12_2_0_, this_.RETRY_TIME as RETRY_TIME13_2_0_, this_.updated as updated14_2_0_ from HR.NOS_DELIVERY_DATA this_ where this_. Fremskridt =? Dvaletilstand:Vælg dette_.dd_id som dd_id1_2_0_, dette_.channel_name som Channel_Name2_2_0_, dette MAX_RETRIES som MAX_RETRIES8_2_0_, dette_.PROGRESS som PROGRESS9_2_0_, dette_.PROGRESS_ID som PR OGRESS_ID10_2_0_, this_.RECIPIENT_CRID as RECIPIENT_CRID11_2_0_, this_.RETRY_COUNTER as RETRY_COUNTER12_2_0_, this_.RETRY_TIME as RETRY_TIME13_2_0_, this_.updated as updated14_2_0_ from HR.NOS_DELIVERY_DATA this_ where this_.PROGRESS=?Hibernate:select DD_ID from HR.NOS_DELIVERY_DATA where DD_ID =? for updateHibernate:vælg DD_ID fra HR.NOS_DELIVERY_DATA hvor DD_ID =? for updateHibernate:opdatering HR.NOS_DELIVERY_DATA sæt CHANNEL_NAME=?, oprettet=?, DELIVERY_TIME=?, ERROR_CODE=?, ERROR_MESSAGE=?, EVENT_ID=?, MAX_RETRIES=?, PROGRESS=?, PROGRESS_ID=?, PROGRESS_ID=?, RETRY_COUNT=?, RETRY_COUNT=? ?, RETRY_TIME=?, opdateret=? hvor DD_ID=?Dvaletilstand:opdater HR.NOS_DELIVERY_DATA sæt CHANNEL_NAME=?, oprettet=?, DELIVERY_TIME=?, ERROR_CODE=?, ERROR_MESSAGE=?, EVENT_ID=?, MAX_RETRIES=?, PROGRESS=?, PROGRESS_ID=CRID,=RETRESS_ID=? , RETRY_COUNTER=?, RETRY_TIME=?, opdateret=? hvor DD_ID=?