여러 트랜잭션이 동시에 같은 데이터에 접근할 때, 데이터의 일관성을 보장하기 위해 자원에 잠금을 적용
비관적 락(Pessimistic Lock)
// JPA 코드 예시
@Lock(LockModeType.PESSIMISTIC_WRITE)
Account findById(Long id);
// SQL문 예시
SELECT * FROM accounts WHERE id = 1 FOR UPDATE;
낙관적 락(Optimistic Lock)
// JPA 코드 예시
@Entity
public class Account {
@Id
private Long id;
@Version // 버전 필드 선언하면 JPA가 관리
private Long version;
private BigDecimal balance;
}
// SQL 예시
UPDATE inventory SET quantity = quantity - 1, version = version + 1
WHERE product_id = 1 AND version = {버전}; // 버전 체크