데이터 베이스 MySQL 튜토리얼 MySQL 동시성 제어 원리

MySQL 동시성 제어 원리

Aug 19, 2019 am 11:41 AM
동시성 제어

Mysql은 고성능 데이터 저장 서비스를 제공하는 주류 오픈소스 관계형 데이터베이스입니다. 백엔드 개발을 할 때

때때로 성능 병목 현상이 발생합니다. 때로는 이러한 병목 현상이 애플리케이션 자체에서 발생하는 것이 아니라 데이터베이스 수준에서 발생합니다.

그래서 Mysql의 기본 원리 중 일부를 익히면 Mysql을 더 잘 이해하고, Mysql에서 성능 튜닝을 수행하고,

이를 통해 고성능 백엔드 서비스를 개발하는 데 도움이 됩니다.

1. mysql의 논리적 프레임워크

mysql의 논리적 프레임워크 다이어그램은 다음과 같습니다.

MySQL 동시성 제어 원리

최상위 레이어는 클라이언트의 연결을 처리합니다.

접속 처리, 권한 인증, 보안 등을 주로 담당합니다. MySQL은 클라이언트로부터의 연결을 처리하기 위해 이 계층에서 스레드 풀을 유지 관리합니다. MySQL은 사용자 이름과 비밀번호 인증을 사용할 수 있으며,

SSL 기반 X.509 인증서 인증도 사용할 수 있습니다.

두 번째 레이어는 쿼리 캐시, 파서, 최적화 프로그램의 세 부분으로 구성됩니다. 파서는 SQL 문을 구문 분석하는 데 사용되며 최적화 프로그램은 구문 분석된 문을 최적화합니다.

쿼리를 구문 분석하기 전에 서버는 먼저 쿼리 캐시를 확인합니다. 해당 쿼리 결과가 있으면 쿼리 구문 분석, 최적화 등의 작업 없이 쿼리 결과가 직접 반환됩니다. 저장 프로시저, 트리거, 뷰 등은 모두 이 계층에서 구현됩니다.

세 번째 계층은 스토리지 엔진입니다 스토리지 엔진은 MySQL에 데이터 저장, 데이터 추출, 트랜잭션 시작 등을 담당합니다. 스토리지 엔진은 API를 통해 상위 계층과 통신합니다. 이러한 API는 서로 다른 스토리지 엔진 간의 차이점을 보호하여 이러한 차이점을 상위 계층 쿼리 프로세스에 투명하게 만듭니다. 스토리지 엔진은 SQL을 구문 분석하지 않습니다. mysql에 가장 일반적으로 사용되는 스토리지 엔진은 InnoDB입니다.

2. mysql의 동시성 제어

여러 스레드가 동시에 데이터를 작업할 경우 동시성 제어 문제가 발생할 수 있습니다.

2-1. 읽기-쓰기 잠금

여러 스레드가 데이터를 읽기만 하는 경우 실제로는 서로 영향을 주지 않고 함께 읽을 수 있습니다. 이때 공유 잠금이라고도 하는 "읽기 잠금"을 사용해야 합니다. .

읽기 잠금을 획득한 스레드는 서로를 차단하지 않으며 동시에 리소스를 읽을 수 있습니다.

스레드가 데이터를 써야 하는 경우 배타적 잠금이라고도 하는 "쓰기 잠금"을 사용해야 합니다.

쓰기 잠금은 쓰기 작업이 완료될 때까지 다른 쓰기 잠금과 읽기 잠금을 차단합니다.

2. 잠금 세분성

우선, 개념을 명확히 합시다. 특정 리소스에서 잠가야 하는 데이터가 적을수록 시스템이 처리할 수 있는 동시성의 양은 더 높아집니다.

그러나 잠금도 리소스를 소비합니다. 시스템이 데이터에 액세스하는 대신 잠금을 관리하는 데 많은 시간을 소비한다면

시스템 성능에 영향을 미칠 수 있습니다.

좋은 "잠금 전략"은 잠금 비용과 데이터 보안 사이의 균형을 찾는 것입니다. Mysql은 여러 스토리지 엔진의 아키텍처를 지원합니다.

각 스토리지 엔진은 자체 잠금 전략과 잠금을 구현할 수 있습니다.

2-3. 테이블 잠금 및 행 잠금

테이블 잠금은 이름 그대로 테이블 전체를 잠급니다. 테이블 잠금 오버헤드는 상대적으로 작습니다. 테이블에 쓰기 잠금을 추가하면 다른 사용자가 이 테이블에 대해 수행하는 모든 읽기 및 쓰기 작업이 차단됩니다.

Mysql에서는 스토리지 엔진이 자체 잠금을 제공할 수 있지만 MySQL은 때때로 ALTER TABLE과 같은 문과 같은 테이블 잠금을 사용합니다.

쓰기 잠금은 읽기 잠금보다 우선순위가 높으므로 읽기 잠금 대기열 앞에 쓰기 잠금 요청이 삽입될 수 있습니다.

행 수준 잠금은 전체 행을 잠그므로 동시 처리를 최대한 지원할 수 있지만 잠금 해제에 따른 오버헤드도 상대적으로 높습니다. 행 수준 잠금은 스토리지 엔진 계층에서만 구현됩니다.

모든 스토리지 엔진은 자체 방식으로 행 수준 잠금을 구현합니다.

3. MVCC

MVCC는 행 수준 잠금의 변형이라고 간주할 수 있지만 많은 경우 잠금 작업을 피하므로

오버헤드가 더 낮습니다. .

주요 관계형 데이터베이스는 모두 MVCC를 구현하지만 구현 메커니즘은 다릅니다. 실제로 MVCC에는 통일된 표준이 없습니다.

그러나 대부분은 비차단 읽기 작업을 구현하고 쓰기 작업은 필요한 행만 잠급니다.

MVCC는 실행 중 각 거래에 표시되는 데이터의 일관성을 보장합니다.

그러나 서로 다른 트랜잭션은 서로 다른 시간에 시작되므로 동일한 테이블에 대해 동시에 표시되는 데이터가 다를 수 있습니다.

Mysql의 InnoDB 엔진은 각 레코드 행 뒤에 두 개의 숨겨진 열을 저장하여 구현됩니다.

하나는 행의 생성 시간을 저장하고, 다른 하나는 행의 만료 시간(또는 삭제 시간)을 저장합니다.

사실 저장되는 것은 실제 타임스탬프가 아닌 '시스템 버전 번호'입니다.

거래가 시작될 때마다 시스템 버전 번호가 증가합니다. 트랜잭션이 시작되면 시스템 버전 번호는 쿼리된 행의 버전 번호와 비교하는 데 사용되는 트랜잭션 버전 번호로 사용됩니다.

다음은 일반적인 CRUD 작업에서 버전 번호가 작동하는 방식을 소개합니다.

INSERT

현재 시스템 버전을 라인 버전 번호로 저장

DELETE

현재 시스템 버전 번호를 이 라인 A "에 저장합니다. 삭제된 버전' 데이터입니다.

업데이트

새 레코드 행을 삽입하고 현재 시스템 버전 번호를 탐색 버전 번호로 저장하고 현재 시스템 버전 번호를 원래 행의 "삭제 버전"에 저장합니다.

SELECT

현재 트랜잭션 버전보다 이전 버전의 행만 찾습니다. 이렇게 하면 트랜잭션에서 읽은 행이 이전에 존재했거나 트랜잭션 자체에 의해 삽입 또는 수정되었는지 확인됩니다.

행의 "삭제 버전"이 정의되지 않았거나 현재 거래 버전 번호보다 큽니다. 이렇게 하면 트랜잭션

에서 읽은 행이 트랜잭션 전에 삭제되지 않았는지 확인할 수 있습니다.

MVCC는 REPEATABLE READREAD COMMITTED의 두 가지 격리 수준에서만 작동하며 다른 두 가지 격리 수준은 작동할 수 없습니다.

READ UNCOMMITTED는 현재 트랜잭션 버전과 일치하는 데이터 행이 아닌 항상 최신 데이터를 읽기 때문입니다. 그리고 SERIALIZABLE은 읽은 모든 행을 잠급니다. REPEATABLE READREAD COMMITTED两个隔离级别下工作,其它两个隔离级别不能工作。

因为READ UNCOMMITTED总是读取最新的数据防,而不是符合当前事务版本的数据行。而SERIALIZABLE

위 내용은 동시성 제어에 대한 몇 가지 질문입니다. 더 많은 관련 질문이 있으면 PHP 중국어 웹사이트의 관련 튜토리얼을 방문하세요.

추천 비디오 튜토리얼:

https://www.php.cn/course/list/51/type/2.html

위 내용은 MySQL 동시성 제어 원리의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Java 컬렉션 프레임워크의 동시성 제어 및 스레드 안전성 Java 컬렉션 프레임워크의 동시성 제어 및 스레드 안전성 Apr 12, 2024 pm 06:21 PM

Java 컬렉션 프레임워크는 스레드로부터 안전한 컬렉션 및 동시성 제어 메커니즘을 통해 동시성을 관리합니다. 스레드로부터 안전한 컬렉션(예: CopyOnWriteArrayList)은 데이터 일관성을 보장하는 반면 스레드로부터 안전하지 않은 컬렉션(예: ArrayList)에는 외부 동기화가 필요합니다. Java는 잠금, 원자 작업, ConcurrentHashMap 및 CopyOnWriteArrayList와 같은 메커니즘을 제공하여 동시성을 제어함으로써 멀티스레드 환경에서 데이터 무결성과 일관성을 보장합니다.

C# 개발 고려 사항: 다중 스레드 프로그래밍 및 동시성 제어 C# 개발 고려 사항: 다중 스레드 프로그래밍 및 동시성 제어 Nov 22, 2023 pm 01:26 PM

C# 개발에서는 데이터와 작업이 증가함에 따라 다중 스레드 프로그래밍과 동시성 제어가 특히 중요합니다. 이번 글에서는 멀티스레드 프로그래밍과 동시성 제어라는 두 가지 측면에서 C# 개발 시 주의해야 할 몇 가지 사항을 소개합니다. 1. 멀티스레드 프로그래밍 멀티스레드 프로그래밍은 CPU의 멀티코어 자원을 활용하여 프로그램 효율성을 향상시키는 기술입니다. C# 프로그램에서는 Thread 클래스, ThreadPool 클래스, Task 클래스 및 Async/Await를 사용하여 다중 스레드 프로그래밍을 구현할 수 있습니다. 하지만 멀티스레드 프로그래밍을 할 때는

golang 함수 동시성 제어 및 타사 라이브러리 통합 및 확장 golang 함수 동시성 제어 및 타사 라이브러리 통합 및 확장 Apr 25, 2024 am 09:27 AM

동시 프로그래밍은 Go through Goroutine에서 구현되며 동시성 제어 도구(예: WaitGroup, Mutex) 및 타사 라이브러리(예: sync.Pool, sync.semaphore, queue)를 사용하여 기능을 확장할 수 있습니다. 이러한 라이브러리는 작업 관리, 리소스 액세스 제한, 코드 효율성 향상과 같은 동시 작업을 최적화합니다. 큐 라이브러리를 사용하여 작업을 처리하는 예에서는 실제 동시성 시나리오에서 타사 라이브러리를 적용하는 방법을 보여줍니다.

Go 언어의 http.Transport 동시성 제어 전략 및 성능 최적화 기술 Go 언어의 http.Transport 동시성 제어 전략 및 성능 최적화 기술 Jul 22, 2023 am 09:25 AM

Go 언어에서 http.Transport의 동시성 제어 전략 및 성능 최적화 기술 Go 언어에서는 http.Transport를 사용하여 HTTP 요청 클라이언트를 생성하고 관리할 수 있습니다. http.Transport는 Go의 표준 라이브러리에서 널리 사용되며 동시성 제어 기능뿐만 아니라 구성 가능한 많은 매개변수를 제공합니다. 이 기사에서는 http.Transport의 동시성 제어 전략을 사용하여 성능을 최적화하고 작동하는 예제 코드를 보여주는 방법에 대해 설명합니다. 하나,

성능 및 최적화 전략에 대한 golang 함수 동시성 제어의 영향 성능 및 최적화 전략에 대한 golang 함수 동시성 제어의 영향 Apr 24, 2024 pm 01:18 PM

동시성 제어가 GoLang 성능에 미치는 영향: 메모리 소비: 고루틴은 추가 메모리를 소비하며, 고루틴 수가 많으면 메모리 고갈이 발생할 수 있습니다. 스케줄링 오버헤드: 고루틴을 생성하면 스케줄링 오버헤드가 발생하고, 고루틴을 자주 생성하고 삭제하면 성능에 영향을 미칩니다. 잠금 경쟁: 여러 고루틴이 공유 리소스에 액세스할 때 잠금 동기화가 필요합니다. 잠금 경쟁은 성능 저하와 지연 시간 연장으로 이어집니다. 최적화 전략: 고루틴을 올바르게 사용하십시오. 필요한 경우에만 고루틴을 생성하십시오. 고루틴 수를 제한하세요. 동시성을 관리하려면 채널이나 sync.WaitGroup을 사용하세요. 잠금 경합 방지: 잠금이 없는 데이터 구조를 사용하거나 잠금 유지 시간을 최소화합니다.

MySQL에서 동시 액세스를 제어하기 위해 분산 잠금을 사용하는 방법은 무엇입니까? MySQL에서 동시 액세스를 제어하기 위해 분산 잠금을 사용하는 방법은 무엇입니까? Jul 30, 2023 pm 10:04 PM

MySQL에서 동시 액세스를 제어하기 위해 분산 잠금을 사용하는 방법은 무엇입니까? 데이터베이스 시스템에서는 높은 동시 액세스가 일반적인 문제이며 분산 잠금은 일반적인 솔루션 중 하나입니다. 이 기사에서는 MySQL에서 분산 잠금을 사용하여 동시 액세스를 제어하는 ​​방법을 소개하고 해당 코드 예제를 제공합니다. 1. 원칙 분산 잠금은 동시에 하나의 스레드만 리소스에 액세스할 수 있도록 공유 리소스를 보호하는 데 사용할 수 있습니다. MySQL에서는 분산 잠금을 다음과 같은 방법으로 구현할 수 있습니다. lock_tabl이라는 파일을 생성합니다.

MySQL과 Oracle: 다중 버전 동시성 제어 및 데이터 일관성 지원 비교 MySQL과 Oracle: 다중 버전 동시성 제어 및 데이터 일관성 지원 비교 Jul 12, 2023 pm 01:10 PM

MySQL과 Oracle: 다중 버전 동시성 제어 및 데이터 일관성 지원 비교 소개: 오늘날의 데이터 집약적 애플리케이션에서 데이터베이스 시스템은 데이터 저장 및 관리를 실현하는 데 핵심적인 역할을 합니다. MySQL과 Oracle은 엔터프라이즈급 애플리케이션에서 널리 사용되는 두 가지 잘 알려진 관계형 데이터베이스 관리 시스템(RDBMS)입니다. 다중 사용자 환경에서 데이터 일관성 및 동시성 제어를 보장하는 것은 데이터베이스 시스템의 중요한 기능입니다. 이 기사에서는 MySQL과 Oracle 간의 다중 버전 동시성 제어 및 데이터를 공유합니다.

MySQL 분산 트랜잭션 처리 및 동시성 제어 프로젝트 경험 분석 MySQL 분산 트랜잭션 처리 및 동시성 제어 프로젝트 경험 분석 Nov 02, 2023 am 09:01 AM

MySQL 분산 트랜잭션 처리 및 동시성 제어 프로젝트 경험 분석 최근 몇 년 동안 인터넷의 급속한 발전과 사용자 수가 증가함에 따라 데이터베이스에 대한 요구 사항도 증가했습니다. 대규모 분산 시스템에서 가장 일반적으로 사용되는 관계형 데이터베이스 관리 시스템 중 하나인 MySQL은 항상 중요한 역할을 해왔습니다. 그러나 데이터 크기가 증가하고 동시 액세스가 증가함에 따라 MySQL의 성능과 확장성은 심각한 문제에 직면하게 되었습니다. 특히 분산 환경에서는 트랜잭션을 처리하고 동시성을 제어하는 ​​방법이 해결해야 할 시급한 요구 사항이 되었습니다.

See all articles