sql >> データベース >  >> RDS >> Oracle

JPAペシミスティックロックが機能しない

    この観察を確認することができます。 H2データベースでいくつかのロックモードをテストしましたが、すべて期待どおりに機能しました。悲観的なロックモードはどちらも、Oracleデータベースと組み合わせて正しく機能しませんでした。したがって、質問:このコードの何が問題になっていますか?

    Oracleでは、これらの同時コード実行のうち2つで同じデータが生成されますが、最初の実行では2番目のコードがブロックされます。

    // Every Thread gets its own Hibernate session:
    final Session session = HibernateSessionHolder.get();
    
    session.getTransaction().begin();
    final List<EventDeliveryDataDB> eddList = 
            session.createCriteria(EventDeliveryDataDB.class)
                .setLockMode(LockMode.PESSIMISTIC_WRITE) // with READ the same
                .add(eq("progress", NEW))
                .list();
    eddList.stream().forEach(eddElem -> eddElem.setProgress(IN_PROGRESS));
    session.getTransaction().commit();
    

    Hibernateログ:

    Hibernate: select this_.DD_ID as DD_ID1_2_0_, this_.CHANNEL_NAME as CHANNEL_NAME2_2_0_, this_.created as created3_2_0_, this_.DELIVERY_TIME as DELIVERY_TIME4_2_0_, this_.ERROR_CODE as ERROR_CODE5_2_0_, this_.ERROR_MESSAGE as ERROR_MESSAGE6_2_0_, this_.EVENT_ID as EVENT_ID7_2_0_, 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_.PROGRESS=?
    Hibernate: select this_.DD_ID as DD_ID1_2_0_, this_.CHANNEL_NAME as CHANNEL_NAME2_2_0_, this_.created as created3_2_0_, this_.DELIVERY_TIME as DELIVERY_TIME4_2_0_, this_.ERROR_CODE as ERROR_CODE5_2_0_, this_.ERROR_MESSAGE as ERROR_MESSAGE6_2_0_, this_.EVENT_ID as EVENT_ID7_2_0_, 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_.PROGRESS=?
    Hibernate: select DD_ID from HR.NOS_DELIVERY_DATA where DD_ID =? for update
    Hibernate: select DD_ID from HR.NOS_DELIVERY_DATA where DD_ID =? for update
    Hibernate: update HR.NOS_DELIVERY_DATA set CHANNEL_NAME=?, created=?, DELIVERY_TIME=?, ERROR_CODE=?, ERROR_MESSAGE=?, EVENT_ID=?, MAX_RETRIES=?, PROGRESS=?, PROGRESS_ID=?, RECIPIENT_CRID=?, RETRY_COUNTER=?, RETRY_TIME=?, updated=? where DD_ID=?
    Hibernate: update HR.NOS_DELIVERY_DATA set CHANNEL_NAME=?, created=?, DELIVERY_TIME=?, ERROR_CODE=?, ERROR_MESSAGE=?, EVENT_ID=?, MAX_RETRIES=?, PROGRESS=?, PROGRESS_ID=?, RECIPIENT_CRID=?, RETRY_COUNTER=?, RETRY_TIME=?, updated=? where DD_ID=?
    


    1. MySqlでEntityFramework6を使用したDbUpdateConcurrencyException

    2. pgAdminエラー-リレーション[関数/ビュー/トリガー関数の名前]が存在しません

    3. PostgreSQL:VACCUMFULLとpg_dumpおよびrestore

    4. mysqlDateTimeフィールドの時間のみを更新します