java 乐観ロックはどのように実装されますか?

Javaでは、楽観ロックは通常、バージョン番号を使って実装されています。楽観ロックは、複数のスレッド間の衝突はまれであると仮定し、データをロックせず、バージョン番号によってデータが変更されたかどうかを判断します。

具体的な実施手順は次のとおりです。

  1. データベーステーブルにバージョン番号カラム(例: version)を追加します。
  2. データを更新する前に、データのバージョン番号を読み取ります。
  3. データ更新時にはバージョン番号を1インクリメントし、更新したバージョン番号をDBに書き戻す。
  4. データベース内のバージョン番号が読み込んだバージョン番号と一致することを更新時に確認する。一致すれば他のスレッドによるデータ更新がないため更新処理を実行できる。一致しない場合は他のスレッドがすでにデータの更新処理を行っているためロールバックなど別の処理を行う必要がある。
  5. ビジネスの需要に応じ、再試行の回数を設定すると、更新時に失敗した場合、更新が成功するまで再試行できます。

次に簡単なJavaコードの例を示します。

// 假设有一个User类,其中包含id、name和version字段
class User {
    private Long id;
    private String name;
    private int version;
    
    // getter和setter方法省略
}

class UserService {
    public void updateUser(User user) {
        // 读取数据的版本号
        int version = user.getVersion();
        
        // 更新数据之前,先读取最新的版本号
        int latestVersion = readLatestVersionFromDatabase(user.getId());
        
        // 检查版本号是否一致
        if (version == latestVersion) {
            // 版本号一致,可以更新数据
            // 更新数据的逻辑...
            
            // 更新成功后,将版本号+1,并写入数据库
            user.setVersion(version + 1);
            updateVersionInDatabase(user.getId(), user.getVersion());
        } else {
            // 版本号不一致,说明其他线程已经更新了数据
            // 重新尝试更新或进行其他处理...
        }
    }
    
    // 从数据库中读取最新的版本号
    private int readLatestVersionFromDatabase(Long id) {
        // ...
    }
    
    // 将最新的版本号写入数据库
    private void updateVersionInDatabase(Long id, int version) {
        // ...
    }
}

なお、楽観的ロックの実装にはデータベースのサポートが必要で、データベースのバージョン番号フィールドを個別に管理し、データを更新する際に比較と更新を行う必要があります。

bannerAds