본문 바로가기

데이터베이스 & ORM10

비관적 락(Pessimistic Lock) 구독 시스템을 관리하며 비관적 락을 사용하게 되었다.  @Repositorypublic interface SubscriptionRepository { @Lock(LockModeType.PESSIMISTIC_WRITE) @Query("SELECT s FROM Subscription s WHERE s.subscriptionId = :subscriptionId") Optional findBySubscriptionIdWithLock(@Param("subscriptionId") String subscriptionId);}  이 코드가 실행될 때 실제로 SQL은 이렇게 동작한다.  SELECT * FROM subscriptions s WHERE s.subscription_id = ? FOR UPDA.. 2024. 11. 22.
PostgreSQL & pgvector 1. 프로젝트 내 구현 사례1.1 PGVector 확장 및 테이블 설정-- init.sql에서 구현된 Vector 설정CREATE EXTENSION IF NOT EXISTS vector;CREATE TABLE prompts ( id UUID PRIMARY KEY, prompt_id VARCHAR(255) UNIQUE NOT NULL, original_prompt TEXT NOT NULL, improved_prompt TEXT, embedding_vector vector(1536), status VARCHAR(50) NOT NULL, created_at TIMESTAMP NOT NULL, updated_at TIMESTAMP NOT NULL);-- Vector 유.. 2024. 11. 16.
REPEATABLE READ 1. REPEATABLE READ1.1 결제 서비스에서의 사용@Service@RequiredArgsConstructorpublic class KakaoPayService { @Transactional(isolation = Isolation.REPEATABLE_READ) public PaymentResponse initiatePayment(PaymentRequest request) { DefaultTransactionDefinition def = new DefaultTransactionDefinition(); def.setIsolationLevel(TransactionDefinition.ISOLATION_REPEATABLE_READ); TransactionS.. 2024. 11. 15.
Row-Level Lock 1. Row-Level Lock 개념Row-Level Lock은 데이터베이스에서 동시성 제어를 위해 개별 행(row) 단위로 잠금을 수행하는 메커니즘1.1 Lock 종류-- 1. Exclusive Lock (X-Lock)SELECT * FROM paymentsWHERE payment_id = 'P123' FOR UPDATE;-- 2. Shared Lock (S-Lock)SELECT * FROM paymentsWHERE payment_id = 'P123' FOR SHARE;-- 3. 조건부 LockSELECT * FROM paymentsWHERE payment_id = 'P123' FOR UPDATE SKIP LOCKED;1.2 JPA에서의 사용@Lock(LockModeType.PESSIMISTIC_WRI.. 2024. 11. 12.
VACUUM ANALYZE VACUUM ANALYZE 구현 예제1.1 Vector 데이터베이스 관리@Component@RequiredArgsConstructorpublic class CustomVectorRepository { private final JdbcTemplate jdbcTemplate; @Scheduled(cron = "0 0 2 * * *") // 매일 새벽 2시 public void maintainVectorIndex() { try { // VACUUM ANALYZE 실행 jdbcTemplate.execute("VACUUM ANALYZE prompts"); log.info("Successfully completed VACUUM.. 2024. 11. 11.
PostgreSQL GIN 1. GIN(Generalized Inverted Index) 개요GIN 인덱스 사용 예시-- 프롬프트의 키워드와 카테고리 검색을 위한 GIN 인덱스CREATE INDEX idx_config ON prompts USING GIN (config);-- 벡터 유사도 검색을 위한 인덱스CREATE INDEX prompt_vector_idx ON prompts USING ivfflat (embedding_vector vector_l2_ops)WITH (lists = 100);1.1 GIN의 특징다중 값 데이터 타입 처리JSONB배열전문 검색(Full-text search)구조키 -> 포스팅 리스트(해당 키가 출현하는 행들의 목록)B-tree와 달리 하나의 열이 여러 키를 가질 수 있음2. 프로젝트 내 GI.. 2024. 11. 10.