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

PostgresによるSpringDataPessimisticLockのタイムアウト

    以下のように提供された場合、javax.persistence.lock.timeoutも機能しません

    @QueryHints({@QueryHint(name = "javax.persistence.lock.timeout",value = "15000")})
    

    しかし、それから私はうまくいく何か他のものを試しました。 @Repositoryを使用してCrudRepositoryを使用する代わりに、エンティティマネージャーを使用してHibernateを構成しています。ロックおよびロックタイムアウトの設定とともにcreateQueryを使用しました。そして、この構成は期待どおりに機能しています。 2つのトランザクションが並行して実行されており、DB内のまったく同じ行をロックしようとしています。最初のトランザクションはWRITEロックを取得でき、ロックを解放する前に約10秒間ロックを保持します。一方、2番目のトランザクションは同じ行のロックを取得しようとしますが、javax.persistence.lock.timeoutが15秒に設定されているため、ロックが解放されるのを待ってから、独自のロックを取得します。したがって、フローをシリアル化します。

    @Component
    public class Repository {
    
        @PersistenceContext
        private EntityManager em;
    
        public Optional<Cache> getById(int id){
            List<Cache> list = em.createQuery("select c from Cache c where c.id = ?1")
                                .setParameter(1, id)
                                .setHint("javax.persistence.lock.timeout", 15000)
                                .setLockMode(LockModeType.PESSIMISTIC_WRITE)
                                .getResultList();
    
    
            return Optional.ofNullable(list.get(0));
        }
    
        public void save(Cache cache) {
            cache = em.find(Cache.class, cache.getId());
            em.merge(cache);
        }
    }
    

    トランザクションがコミットまたはロールバックされるとロックが解放されるため、このロックメカニズムがトランザクション内にあることを確認してください。



    1. MySql WorkBenchAES256復号化

    2. トレースフラグ2389と新しいカーディナリティ推定量

    3. メールがすでに登録されているかどうかを確認するにはどうすればよいですか?

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