jOOQ同時制御-Optimicロック/persimicロック
1.同時制御
なぜ必要なのか
💡 ソリューション
2.同期制御前の問題
🔱 50トピックごとに1回記事を表示
public class NoLockWorker implements Runnable{
private CountDownLatch countDownLatch;
public NoLockWorker(CountDownLatch countDownLatch){
this.countDownLatch = countDownLatch;
}
@Override
public void run() {
postService.plusHitById(BASE_ID);
countDownLatch.countDown();
}
}
------------------------------------------------------------------
public void plusHitById(Long id){
context.transaction(configuration ->{
final Post post = DSL.using(configuration)
.selectFrom(POST)
.where(POST.ID.eq(id))
.fetchOneInto(Post.class);
final Long hit = post.getHit();
DSL.using(configuration)
.update(POST)
.set(POST.HIT, hit + 1L)
.where(POST.ID.eq(id))
.execute();
});
}
テストに失敗しました
=>hitは50個ですが、50個のマルチスレッドの複数のトランザクションが同時に1つのROWに集中しているため、開発者はhitが5になることを望んでいません.
3. Optimistmic Lock / Pessimistic Lock
🔒 Optimistic Lockとは?
🔏 Persimisic Lockとは?
4.Optimical Lockで同期を制御する
吸い取りVersion列の追加
データベース(Postテーブル)
Gradle
=>jOOQ設定では、Gradleで使用するバージョン列を指定できます.
また、OptimisticsLockが競合によって異常が放出されると、コネクタを噛み続ける場合があり、try with resourcesを使用して競合が発生した場合は直ちにコネクタを閉じます.
public void plusHitOptimisticById(Long id){
try(Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD)){
DSL.using(connection, SQLDialect.MYSQL, new Settings().withExecuteWithOptimisticLocking(true))
.transaction(configuration -> {
PostRecord postRecord = DSL.using(configuration)
.fetchOne(POST, POST.ID.eq(id));
postRecord.setHit(postRecord.getHit() + 1L);
postRecord.store();
});
} catch (SQLException e) {
log.info("error code : {}, error : {}", e.getErrorCode(), e);
}
}
テストに合格する
=>同じバージョンで複数のトランザクションが競合している場合は、前のトランザクションのみが正常に更新され、残りのトランザクションに例外が発生します.例外を取得し、リフレッシュして同期を制御します.
5.Persimisic Lockを使用して同期を制御する
Persimisic Lock for Update
forUpdateには、他のトランザクションのCRUDが許可しないという特徴があります.
テストに合格する
=>スレッドごとにトランザクションがあり、ROWにアクセスして順番にクエリ->更新し、hitが50の結果を得ることができます.
に感銘を与える
💡
同期性を制御する必要がある場合は、アプリケーション・レベルで制御するか、データベース・レベルで制御するかを考慮する必要があります.
データベース・レベルで制御する場合は、ビジネスに適したロックを考慮して選択できますが、Optimical Lockを使用する場合は、それらを構成する方法を考慮する必要があります.
今回は个人的に勉强していた时も、私たちの部分を会社のプロジェクトに応用したので、もっと面白かったです.
ソース
https://www.jooq.org/doc/latest/manual/sql-execution/crud-with-updatablerecords/optimistic-locking/
Reference
この問題について(jOOQ同時制御-Optimicロック/persimicロック), 我々は、より多くの情報をここで見つけました https://velog.io/@hgs-study/jOOQ-Concurrency-Controllテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol