728x90
728x90
[MySQL] Lost Update와 Write Skew
DB2024. 12. 12. 11:07[MySQL] Lost Update와 Write Skew

서론트랜잭션의 격리 수준 포스팅에서 다루지 않았던 이상현상 중 Lost Update와 Write Skew같은 일관되지 않은 쓰기 결과를 반환하는 데이터 부정합 문제가 있다. PostegraSQL에서는 격리 수준을 REPEATABLE READ로 설정하는 것만으로도 쓰기 결과를 올바르게 보장할 수 있다. 하지만 MySQL의 MVCC(Multi Version Concurrency Control)은 일관된 읽기(Consistence Read)를 지원하지만 위와 같은 데이터 업데이트의 부정합 문제를 REPEATABLE READ의 격리 수준 만으로는 해결할 수 없다.  아래 그림은 MySQL에서 REPEATABLE READ 격리 수준을 사용했을 때 Lost Update가 발생하는 상황이다. 고객 A가 10,000원..

[데이터베이스] MVCC(다중 버전 동시성 제어 - Multi Version Concurrency Control)
DB2024. 12. 2. 22:47[데이터베이스] MVCC(다중 버전 동시성 제어 - Multi Version Concurrency Control)

동시성 제어(Concurrency Control)DBMS에서 동시성 제어는 동시에 데이터에 접근하는 여러 사용자, 즉 여러 트랜잭션의 상호작용에서 트랜잭션의 isolation을 보장하고 일관성과 무결성을 유지할 수 있도록 하는 목적으로 사용되는 기술이다.  이러한 동시성 제어를 하는 대표적인 방식 중 가장 대표적인 Lock을 간단하게 알아보자.  공유 잠금(읽기 잠금, shared lock)이나 배타적 잠금(쓰기 잠금, exclusive lock)을 통해 Lock을 획득한 후 트랜잭션 내부의 작업을 수행하는 방식이다. (read로도 쓰기 잠금을 획득할 수 있다)  다른 트랜잭션은 이전 트랜잭션에서 Lock을 반환해야 작업이 수행이 가능하다는 의미이다.    이는 곧 SERIALIZABLE하다는 의미이며,..

[MySQL] 트랜잭션 격리수준(isolation level)과 이상현상 (with 테스트 코드)
DB2024. 11. 27. 14:56[MySQL] 트랜잭션 격리수준(isolation level)과 이상현상 (with 테스트 코드)

기억에 오래남고 이해하기 쉽게 현재 조직의 웨딩 도메인의 적립금을 예시로 간단한 엔터티 설계와 더불어 테스트 코드를 작성하여 각 격리수준과 이에 따른 이상현상을 정리해보았다. 개념들은 MySQL의 공식문서를 활용하여 정리하였고, AUTO_COMMIT은 FALSE를 가정하고 예제들을 작성하였다. (예제에 필요한 기본적인 엔터티와 데이터 세팅은 아래를 참조) CREATE TABLE icash (    no INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,    user_no INT UNSIGNED UNIQUE NOT NULL,    icash INT UNSIGNED DEFAULT 0 NOT NULL,    created_at TIMESTAMP DEFAULT CURRENT_TIMESTA..

[데이터베이스] 인덱스(index) 정리
DB2024. 7. 10. 17:41[데이터베이스] 인덱스(index) 정리

인덱스   목차, 색인, 책갈피와 같은 기능을 하는 인덱스는, 데이터베이스 분야에서는 어떤 데이터를 검색할 때 속도를 높여주는 자료 구조로메모리 영역에 생성되는 일종의 책갈피이다.    인덱스 구조보통 Hash, B-Tree, B+Tree가 있다. Hash우리가 알고있는 Key, Value형태의 자료 구조다.해시 함수로 키 값을 해시값으로 변환하고, 이 해시 값을 기반으로 데이터를 빠르게 조회할 수 있다. - O(1)   하지만 이런 해시구조의 특성상 범위 검색에 효율이 떨어진다. 키 값이 조금이라도 변하게 되면 완전히 다른 해시 값을 반환하기 때문이다.범위 검색에서의 부등호 연산을 포함한 범위 조건(BETWEEN, LIKE 등)에는 적합하지 않다.   B-TreeB-Tree는 이진 트리를 확장한 트리 ..

DB2023. 3. 16. 06:54[MySQL] 프로시저 (Stored Procedure)

학원 내 모의 프로젝트에서 1. 회원 탈퇴의 경우 일정 기간이 지나면 자동으로 테이블에서 삭제 처리 2. 통계 테이블에 해당 날짜의 자정이되면 자동으로 insert처리 위와 같은 DB 자동화를 구축해 보고 싶었고 강사님께 여쭈어봤더니 CI/CD ?? Jenkins 같은 것들을 학습하면 구현하는 데 도움이 될 거라고 하셨는데 너무 생소한 개념이기도 하고 학습하는데 시간이 다 가서 프로젝트 수행을 못할 것 같아 방법을 찾아보던 중 프로시저를 활용해 MySQL 내에 이벤트를 구현해 간단한 자동화??아닌 자동화를 구현한 적이 있다. 그 때 당시 이해했던 프로시저는 Java의 메서드와 같은 역할을 하는 것인줄 알았다. 함수를 생성하여 이벤트 스케쥴러를 통해 프로시저를 호출했기 때문이다. 지금와서 지난 쿼리를 보니..

[MySQL] 이벤트 생성 - 이벤트 스케쥴러(Event Scheduler)
DB2023. 3. 11. 22:13[MySQL] 이벤트 생성 - 이벤트 스케쥴러(Event Scheduler)

학원 내 모의 프로젝트 중에서 간단하게 이벤트를 생성 해 통계 테이블에 자정마다 날짜를 입력 해 줬던 적이 있다. 사용했던 경험이 있기 때문에 내 것으로 만들어보고자 포스팅을 하게 되었다. 이벤트 생성 아래의 코드는 프로젝트 내 통계 테이블 중 방문자 테이블의 첫 insert를 위해 사용했다. (해당 날짜 방문자는 00:00:00으로 초기화 되어있는 해당 일자 테이블에 방문횟수가 +1되는 구조였다) create event visitDaily on schedule every 1 hour starts now() --comment 주석 do insert into VISIT(VISIT_DATE, NUMBER) select date_format(now(), "%Y%m%d"), 0 from dual where no..

DB2023. 1. 11. 22:49[MySQL/DB] 서브쿼리(SubQuery)

[ 서브쿼리 (SUBQUERY) ] 다른 쿼리 내부에 포함되어 있는 SELECT문을 말한다. 서브쿼리는 괄호() 로 묶어서 표현한다. 서브쿼리 실행 후 메인쿼리를 실행한다. 서브쿼리는 단일 행 연산자(=, >=)와 다중 행 연산자(IN, NOT IN, ANY, EXISTS 등)들을 사용하여 표현한다. 메인쿼리와 서브쿼리 메인쿼리 = 부모쿼리 = 외부쿼리(outer query) 서브쿼리 = 자식쿼리 = 내부쿼리(inner query) SELECT FROM WHERE 조건식 연산자 (SELECT FROM WHERE); 장점 1. 쿼리의 구조화를 통한 가독성 상승 2. 복잡한 JOIN, UNION과 같은 동작을 수행할 수 있는 또 다른 방법을 제공 서브쿼리를 사용 가능 한 곳 ​MySQL에서 서브쿼리를 포함할..

[MySQL/DB] 조인(JOIN), 합집합(UNION), 중복제거(DISTINCT)
DB2023. 1. 8. 19:16[MySQL/DB] 조인(JOIN), 합집합(UNION), 중복제거(DISTINCT)

[ JOIN ] 데이터베이스 내의 여러 테이블에서 가져온 레코드를 조합하여 하나의 테이블이나 결과 집합으로 표현해준다. 관계형 데이터베이스(Relation Database)에서 가장 많이 쓰인다. 특징 조인하는 테이블에는 같은 값을 가진 컬럼이 필요하다. 세 개 이상의 테이블도 조인이 가능하다. 조인할 때 테이블에 대한 별칭이 필요하다. 조인 컬럼을 비교하는 조건이 필요하다. INNER JOIN 조인하는 테이블의 ON 절의 조건이 만족하는 데이터만 가져온다. MySQL에서는 JOIN, INNER JOIN, CROSS JOIN이 같은 의미로 사용된다. 조인 관계에 부합되는 레코드를 모두 가지며, 조인에 부합되지 않는 레코드는 모두 삭제된다. SELECT E.EMPNO, E.ENAME, D.DNAME FRO..

728x90
728x90
image