Entity Versioning

JPA 에서는 @Version Column 을 사용하여 Optimistic Lock 을 지원한다. 따라서 여러 사람이 동일한 데이터의 저장/수정/삭제를 요청한 경우 발생할 수 있는 lost update(나중에 수정/삭제한 내용으로 덮어 쓰이는 것) 를 방지한다.

  • Entity
@Version
@Column(nullable = false)
val version: Int

Persist

Product product = new Product();
product.setId(1L);
entityManager.persist(product);
INSERT INTO product (
    quantity,
    version,
    id
)
VALUES (
    0,
    0,
    1
)

Update

Product product = entityManager.find(
    Product.class,
    1L
);
product.setQuantity(5);
UPDATE
    product
SET
    quantity = 5,
    version = 1
WHERE
    id = 1 AND
    version = 0

Delete

Product product = entityManager.getReference(
    Product.class,
    1L
);
entityManager.remove(product);
DELETE FROM
    product
WHERE
    id = 1 AND
    version = 1

Preventing lost updates