컴퓨터 공학/DB(10)
-
(데이터베이스) Lost update와 serializable
트랜잭션에는 4가지 격리수준이 있습니다. read uncomittedread comittedrepeatable readserializable 그리고 각각의 트랜잭션은 다음과 같은 문제를 발생할 수 있습니다.dirty readnon-repeatable readphantom read(phantom read는 MVCC덕에 발생하지 않습니다.) 하지만 이와 별개로 serialiable을 제외한 트랜잭션 격리 레벨에서 발생할 수 있는 lost update 문제가 있습니다. Lost updateLost Update는 동시성 제어 문제 중 하나로, 두 개 이상의 트랜잭션이 동시에 같은 데이터를 수정하려고 할 때 발생할 수 있습니다. 이는 하나의 트랜잭션이 수행한 업데이트가 다른 트랜잭션에 의해 덮어쓰여지는 상황을 말..
2024.07.14 -
(MySQL) MySQL에서 실시간 쿼리 로그 확인하기
스프링 프로젝트를 진행하다 보면 실제 쿼리가 어떻게 나가는지 궁금할 때가 있습니다. 기본적으로 spring: jpa: show-sql: true 이런 설정을 하게 되면 콘솔창에 쿼리 로그를 보여주기 때문에 웬만한 쿼리는 확인이 가능합니다. 하지만 대량의 쿼리나 JPA에서 변환되어 실제로 MySQL 쿼리로 변환되어 나가는 쿼리는 알지 못한다는 문제가 있습니다. 이때 실시간 로그 확인이 필요하고 함께 로그를 확인하는 방법을 알아보려 합니다. 🧐MySQL 로그 설정하기 실시간 쿼리 로그를 확인하기 위해서는 먼저 로그 설정이 필요합니다. 먼저 MySQL에 접속합니다. mysql -u root -p 그리고 로그 설정을 확인해봅니다. show variables like 'general_log%'; 그럼 아래와 같은..
2022.12.18 -
(MySQL) Docker + MySQL를 Datagrip에 연결하기
이전에는 Dokcer로 MySQL 서버를 띄우는 글을 작성한 적이 있습니다. (Docker) Mysql(PostgreSQL, mariaDB 등)을 도커로 실행시키기 mysql과 postgresql은 각각 3306, 5432 포트를 기본으로 사용하기 때문에 겹칠일이 없지만, mysql과 mariaDB같은 경우 둘다 3306 포트로 실행되는데다, 같은 로컬환경에 출돌이 일어나기 쉽상이다. 그래서 이 mirrorofcode.tistory.com 위 방법은 여전히 잘 실행되는데요, DB를 Datagrip이나 MySQL workbench 같은 툴에 연결하고 싶을 때가 있을 겁니다. (왜인지는 모르겠는데 root 계정은 연결이 안되더라고요.)(사실 안 찾아봄) 이때는 db를 생성해주고, 사용자를 만들어서 권한을 넘..
2022.12.02 -
(MySQL) MySQL 8.0의 메모리 할당 및 사용구조
일반적으로 메모리는 코드, 데이터, 힙, 스택 영역으로 나누어져 있습니다. 그렇다면 MySQL 서버는 메모리를 어떻게 사용할까요? 🧐글로벌 영역과 로컬 영역 MySQL 서버도 일반적인 메모리 구조를 크게 벗어나지 않습니다. 글로벌 영역은 힙 영역, 로컬 영역은 스택 영역과 대조할 수 있겠네요. MySQL의 메모리 할당 방식은 상당히 복잡하기 때문에 MySQL 서버가 상요하는 정확한 메모리의 양을 측정하는 것은 쉽지 않습니다. 그래서 단순하게 MySQL의 시스템 변수로 설정해 둔 만큼 운영체제로부터 메모리를 할당받는다고 생각해도 무방합니다. (실제로 이론적인 계산이 아무런 의미가 없고 경험 기반으로 판단해야 할 때가 더 많다고 한다.) 🧐글로벌 영역 글로벌 영역은 말 그대로 모든 스레드에 공유되는 메모리 ..
2022.11.23 -
(Database) MySQL서버 구조와 스레딩 구조
MySQL을 사용할 때, MySQL은 어떤 방식으로 동작하는지 알고 싶지 않은가? MySQL은 다른 DBMS에 비해서 구조가 상당히 독특하다. Transaction만 봐도 그렇다. Postgresql의 경우, transaction을 적용하고 싶으면, begin과 commit 을 명시해줘야 한다. 하지만 MySQL의 InnoDB의 경우 Transaction을 기본으로 지원하므로, 훨씬 편리하게 사용이 가능하다. 그럼 MySQL 엔진 아키텍처에 대해 알아보자. 🧐MySQL 전체 구조 MySQL은 일반 상용 RDBMS와 같이 대부분의 프로그래밍 언어로 부터 접근 방법을 모두 지원한다. (개꿀) MySQL서버는 크게 MySQL 엔진과 스토리지 엔진으로 구분할 수 있다. MySQL 엔진 MySQL엔진은 커넥션 핸..
2022.07.09 -
(Database) 트랜잭션(ACID)과 무결성
구글에 트랙잭션을 검색하면 가장 많이 나오는 말이 있다. "DB의 상태를 변화시키기 수행하는 단위" 그런데 이것 만으로는 트랜잭션에 관해 전혀 감이 오지 않는다. (나만 그런가?) 나는 이 문장을 접했을 때 드는 생각은 아 DB에 접근하면 다 트랜잭션이구나 트랙잭션 자체의 개념에 대해 이해하지 못하면 스프링 서비스 레이어에 붙이는 @Transactional이나 MySQL에서의 잠금, 동시성에 대한 이해를 할 수 없다고 생각한다. 🧐What is Transaction? 트랙잭션을 이해하는데 가장 도움되는 말은 이것이라고 생각한다. 트랙잭션은 작업의 완전성을 보장해 주는 것이다. 즉, 논리적인 작업 셋을 모두 완벽하게 처리하거나, 처리하지 못할 경우에는 원 상태로 복구해서 작업의 일부만 적용되는 현상이 발생..
2022.07.09