2024/08 58

Lock & 2PL

Write-Lock (Exclusive Lock)Write-Lock은 데이터베이스에서 특정 데이터 항목에 대해 쓰기 operation이 수행될 때, 해당 데이터 항목에 배타적 잠금을 거는 메커니즘이다.특징:배타적 잠금: 한 트랜잭션이 데이터를 수정하기 위해 write-lock을 획득하면, 다른 트랜잭션은 해당 데이터에 대해 읽기(read)나 쓰기(write) operation을 수행할 수 없다. 이는 데이터의 무결성을 유지하기 위한 중요한 메커니즘이다.경합 가능성: 여러 트랜잭션이 동일한 데이터에 대해 동시에 write-lock을 시도하면 경합이 발생하며, 이로 인해 데드락(교착 상태) 등이 발생할 수 있다.예시:T1 트랜잭션이 변수 x의 값을 20으로 변경하기 위해 write-lock을 획득한다.T2 ..

Database 2024.08.17

JDBC 쿼리 및 메서드 실행 로깅

1. JDBC 쿼리 로그 활성화애플리케이션이 실행하는 SQL 쿼리와 그 실행 시간을 로그로 기록하려면, JVM 옵션에서 로그 레벨을 설정해야 한다. 아래는 이를 설정하는 방법이다:-Dlogging.level.jdbc.sqlonly=off # SQL 쿼리만 로깅하지 않음 -Dlogging.level.jdbc.sqltiming=info # SQL 쿼리 실행 시간을 info 레벨로 로깅 -Dlogging.level.jdbc.resultsettable=info # 쿼리 결과를 info 레벨로 로깅 -Dlogging.level.jdbc.audit=off # JDBC audit 로그 비활성화 -Dlogging.level.jdbc.resultset=info # JDBC 결과 셋을 로깅 -Dlogging.level.j..

JVM 2024.08.17

Isolation Level

다중 트랜잭션에서 발생할 수 있는 읽기 및 쓰기 문제문제 유형설명예시Dirty Read커밋되지 않은 데이터를 읽는 상황T1이 피자 가격을 2만 원으로 변경 중,T2가 이 가격을 읽고 T1이 롤백되면 T2의 결과는 잘못된 값이 된다.Non-Repeatable Read같은 트랜잭션 내에서 데이터 값이 달라지는 상황T1이 피자 가격을 3만 원으로 읽고,T2가 2만 원으로 변경 후 커밋, T1이 다시 읽을 때 2만 원으로 변경된 값을 읽는다.Phantom Read트랜잭션 중에새로운 데이터가 추가되거나 기존 데이터가 삭제되어결과가 달라지는 상황T1이 1만 원 이하의 피자를 조회하고,T2가 1만 원 이하로 피자를 추가 후T1이 다시 조회 시 새 피자가 포함된다.Dirty Write커밋되지 않은 트랜잭션이다른 트랜잭..

Database 2024.08.16

Recoverability

Unrecoverable Schedule트랜잭션 간의 의존성으로 인해, 일부 트랜잭션이 롤백될 때 데이터베이스가 이전의 일관된 상태로 복구될 수 없는 상황을 의미한다. 이러한 스케줄이 발생하면 데이터 일관성에 심각한 문제가 생길 수 있으므로, DBMS는 Unrecoverable Schedule을 허용해서는 안 된다.예시T1이 데이터를 변경한다.T1이 커밋하기 전에 T1이 변경한 데이터를 읽고 T2가 커밋한다.T1이 어떤 이유로 롤백되면, T2가 읽어 간 데이터는 잘못된 데이터가 되고, T2의 결과는 잘못된 데이터에 기반하게 된다. T2는 이미 커밋되었기 때문에, T1을 롤백한다고 하더라도 전체 시스템의 일관성을 회복할 수 없게 된다. Recoverable Schedule스케줄 내에서 트랜잭션은 자신이 읽..

Database 2024.08.16

Serializability

Lost Update두 개 이상의 트랜잭션이 동일한 데이터를 동시에 갱신하려고 할 때 발생하는 문제이다. 이로 인해 한 트랜잭션의 결과가 다른 트랜잭션에 의해 덮어써져 이전의 변경 내용이 사라지게 된다.예시:초기 상태: B의 계좌 잔액은 100만 원이다.트랜잭션 1 (T1): A가 B에게 20만 원을 입금한다.트랜잭션 2 (T2): B가 본인 계좌에 30만 원을 입금한다.Lost Update 시나리오:T1과 T2가 동시에 B의 잔액을 읽어온다. 두 트랜잭션은 B의 현재 잔액을 각각 100만 원으로 인식한다.T1이 B의 잔액에 20만 원을 더해 120만 원으로 업데이트한다.T2가 B의 잔액에 30만 원을 더해 130만 원으로 업데이트한다.최종 결과: B의 잔액은 130만 원이 되며, T1에서 수행한 20만..

Database 2024.08.16

Trigger

데이터베이스에서 특정 이벤트가 발생할 때 자동으로 실행되는 특별한 유형의 프로시저이다.특정 테이블에서 데이터가 변경될 때(INSERT, UPDATE, DELETE) 자동으로 실행되며, 보통 데이터 무결성을 유지하거나 자동으로 로그를 기록하는 데 사용된다.자동화: 데이터 변경 시 자동으로 실행되므로, 데이터 무결성을 유지하거나 특정 작업을 자동화할 수 있다.일관성: 동일한 작업을 반복적으로 수행할 수 있어 데이터베이스 내에서 일관성을 유지할 수 있다.보안: 트리거를 사용해 민감한 데이터 변경을 감지하고 로그를 기록하거나 특정 행동을 취할 수 있다.가시성 부족: 트리거는 자동으로 실행되므로, 디버깅이 어렵고 예상치 못한 동작을 유발할 수 있다.성능 저하: 잘못 설계된 트리거는 성능 저하를 초래할 수 있다. ..

Database 2024.08.16

Stored Procedure

데이터베이스 관리 시스템(RDBMS)에 저장되어 특정 작업을 수행하는 로직을 정의한 코드 블록이다.여러 SQL 작업을 절차적으로 수행할 수 있도록 지원하며, 복잡한 비즈니스 로직을 캡슐화하여 데이터베이스에서 직접 실행할 수 있다.하나의 구체적인 작업을 수행하는 데 적합하다.조건문을 사용하여 로직을 분기 처리할 수 있으며, 반복문을 통해 반복 작업을 수행할 수 있다.에러 처리를 위한 로직을 포함할 수 있으며, 특정 상황에 따라 에러를 발생시킬 수도 있다.입력(IN), 출력(OUT), 입력 및 출력(INOUT) 파라미터를 사용하여 데이터를 주고받을 수 있다. 예제 1: 두 정수의 곱셈 결과를 반환하는 프로시저두 개의 정수를 입력받아 그 곱을 출력하는 프로시저.DELIMITER $$CREATE PROCEDUR..

Database 2024.08.16

Stored Function

사용자가 정의한 함수로 DBMS에 저장되고 사용된다.SQL의 SELECT, INSERT, UPDATE, DELETE 구문에서 사용할 수 있다.반복적인 작업을 처리하기 위해 루프를 돌리거나, CASE 키워드를 사용하여 값에 따라 분기 처리할 수 있다.에러 핸들링이나 에러 발생 같은 다양한 동작을 정의할 수 있다.유틸리티 함수로 사용하는 것이 적합하다.비즈니스 로직을 스토어드 함수에 두는 것은 권장되지 않는다. 비즈니스 로직은 데이터베이스 외부에서 처리하거나 애플리케이션 계층에서 유지 관리하는 것이 바람직하다. 예제 1: 임직원 ID 생성 함수임직원의 ID를 10자리 정수로 랜덤 하게 발급하며, ID의 맨 앞자리는 1로 고정된다.DELIMITER $$CREATE FUNCTION id_generator()RE..

Database 2024.08.15

데이터베이스 기본 개념

Database (DB)데이터베이스는 전자적으로 저장되고 관리되는 관련된 데이터들의 조직화된 집합이다. 데이터베이스는 특정 목적을 위해 데이터를 구조화하고 저장하여 효율적으로 접근하고 관리할 수 있도록 한다. Database Management System (DBMS)데이터베이스 관리 시스템(Database Management System, DBMS)은 사용자에게 데이터베이스를 정의, 생성, 관리하는 기능을 제공하는 소프트웨어 시스템이다.데이터베이스 구조를 정의할 때 생성되는 메타데이터(데이터에 관한 데이터) 또한 DBMS에 의해 저장되고 관리된다.DBMS는 데이터베이스를 관리하고 보호하며, 여러 사용자가 동시에 접근할 수 있도록 한다. Database System데이터베이스 시스템은 데이터베이스(DB)..

Database 2024.08.15

GiST와 GIN 인덱스

PostgreSQL은 다양한 데이터 구조와 검색 요구에 대응할 수 있는 인덱싱 시스템을 제공한다. 그중에서도 GiST(Generalized Search Tree)와 GIN(Generalized Inverted Index)은 데이터의 구조와 검색 방식에 따라 최적화된 두 가지 주요 인덱스 유형이다. GiST (Generalized Search Tree)범위 쿼리, 공간 데이터, 사용자 정의 데이터 타입 등 다양한 데이터 구조에 대해 유연한 인덱싱을 제공하는 트리 기반 인덱스이다. B-트리와 유사한 구조를 가지고 있으며, 특정 데이터 타입이나 쿼리 조건에 맞춰 쉽게 확장할 수 있다.구조 및 특성트리 구조: GiST 인덱스는 B-트리와 유사하게 각 노드가 키와 자식 노드 포인터를 포함하는 트리 구조를 가진다...

Database/Postgresql 2024.08.15