4

楽観的ロックをサポートするエンティティのテーブル インデックスを定義するためのベスト プラクティスは何ですか?

確かに、ID による高速検索を有効にするには、エンティティ ID を DB のインデックスの一部にする必要があります。バージョン列はどうですか?それをインデックスの一部にすることは理にかなっていますか?

DB の主キーを定義せず、エンティティ ID + バージョン列からなるインデックスを作成するとどうなるでしょうか。同じエンティティ ID を持つ DB に 2 つの行があるリスクはありますか? 2 つのトランザクションが、同じエンティティ ID を持つ 2 つのエンティティを並行して維持するとしますか?

4

1 に答える 1

2

次のようにバージョン列で定義されたエンティティがあるとします。

@Entity
public class MyEntity implements Serializable {    

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @Version
    private Long version;

    //...
}

更新時に、 で注釈が付けられたフィールド@Versionがインクリメントされ、WHERE 句に追加されます。次に例を示します。

UPDATE MYENTITY SET ..., VERSION = VERSION + 1 WHERE ((ID = ?) AND (VERSION = ?))

ご覧のとおり、version 列はWHERE句で使用されていますが、ID 列 (主キーであるため、既にインデックスが設定されています) も使用されているため、追加するメリットはあまりないと思います。 VERSION 列へのインデックス

于 2013-01-03T02:54:58.690 に答える