MySQL 데이터베이스 연구 (B) ------ 트랜잭션 로그 + + 잠금 장치에서 MySQL을

MySQL 데이터베이스 잠금

데이터베이스 잠금 분류

  • 로크 단위로 분할 된 테이블 레벨 잠금 행 레벨 잠금 페이지 수준 잠금으로 분할 될 수있다
  • 잠금 수준을 클릭하면, 공유 잠금으로 나눌 수 있습니다, 배타적 잠금
  • 방법 로킹하는 것은 자동으로 로크로 나눌 수함으로써 디스플레이를 잠그
  • 눌러 동작 모드가 DML 잠금, DDL 잠금 장치로 나눌 수있다 (조사의 유형 여기서 로크에 대응 DML 문의 추가 한 구조 DDL 잠금이 유형의 동작의 변경)
  • 사용하여 낙관적 잠금으로 나눌 수 있습니다, 비관적 잠금

낙관적 잠금 : 항상 최상의 경우를 가정 데이터가 수정되지 않습니다 생각 다른 사람을 데리러 때마다,이 고정되지 않지만 업데이트가이 시간 동안 다른 사람들이 결정하는 때 데이터를 업데이트하지 않았다, 당신은 버전 번호 CAS 메커니즘과 알고리즘을 사용할 수 있습니다. 들어 장면을 다 읽고.
비관적 잠금 : 항상 데이터를 생각 수정 때 시간을 얻을, 최악의 경우를 가정 다른 것, 그녀는 사람들이 잠금을 얻을 때까지 차단됩니다이 데이터를 가지고 할 수 있도록 데이터가 잠 깁니다했다 때마다 너무 (스레드에 시간을 사용하여 공유 자원은 다른 스레드가 차단 한 다음 다른 스레드에 대한 자원의 전송을 실행한다). 전통적인 관계형 데이터베이스 내부는이 잠금 장치를 많이 사용하는, 같은 행 등 잠금, 테이블 잠금, 읽기 잠금, 쓰기 잠금, 첫 번째 작업을 수행하기 전에 잠 깁니다. 자바의 구현은 동기화 ReentrantLock와 다른 배타적 잠금에 비관적 잠금 생각이다. 장면을 쓰기에 적용됩니다.

잠금 장치의 측면에의 MyISAM과 InnoDB의 차이

기본 MyISAM 테이블 수준 잠금은 잠금 행 수준을 지원하지 않습니다, 사용
InnoDB의 기본 사용 행 수준 잠금에, 또한 테이블 수준 잠금을 지원

의 MyISAM 中

  1. SELECT가 생성되면, 판독 로크가 해제 될 때까지이 UPDATE, INSERT, 삭제가 블록으로, BLOCK 될 경우 테이블 레벨이 시점에서, 잠금을 읽었다.
  2. 마찬가지로, 업데이트, 삽입, 삭제하면, 테이블 레벨 쓰기 잠금을 생성, SELECT는 블록으로 기록되는 잠금이 해제 될 때까지 슈팅.

표는 수동으로 읽기 / 쓰기 잠금을 증가 :

LOCK TABLES table_name read|write;

잠금 읽기 다음 공유 잠금을 수행 정상 거기 SELECT 조작 후, 이미 진행 같은 테이블이 시간에 SELECT 동작이며, 제 2 선택 동작이 차단되지 않고, 경우에 있기 때문에이 로크 될 수있다 선택은 두 가지 작업이라고도 공유 잠금 공유합니다. 로를 설정하는 대한 그러나, 첫 번째 SELECT 문 플러스 업데이트의 뒤쪽에, 배타적 잠금 때문에 SELECT 작업이있는 경우이 때, 작업이 차단으로 떨어질 것이다
쓰기 잠금 : 이미 쓰기 잠금이있는 경우, 더 쓰기 잠금을 설정하거나 읽으면 지금부터, 차단 된 상태로 떨어질 것이다.

이노

트랜잭션 일괄 작업 안에 고정되는 제 및 커밋 나타나면하고 통합 해제하는 잠금 추가 : 이노 잠금 및 잠금 해제가 두 단계로 분할되어, 두 단계 잠금을 사용

기본값이 자동으로 MySQL을의 InnoDB의 트랜잭션에 제출되어 있기 때문에, 트랜잭션이 자동으로 제출 폐쇄, 당신은 사용할 수 있습니다

SET autocommit = 0;

InnoDB의 잠금 장치가 기본 행 수준에서 지원된다 InooDB에서 SELECT에서 읽기 잠금은 SELECT 문 후 공유 모드 잠금을 추가해야합니다 추가 할 필요가 명시 적으로 최적화되어 있습니다

행 레벨 잠금을 사용하여 인덱스에서 사용 이노 테이블 레벨 잠금을 사용하여 인덱스를 사용하지 SQL에서,

그림 삽입 설명 여기

MySQL 데이터베이스 교착 상태

의 MyISAM은 행 수준 잠금을 지원하는 MySQL의 있도록 교착 상태에 주로 이노 스토리지 엔진 교착 상태에 대해 이야기하지 않습니다.


두 가지 방법으로 교착 상태를 해결 MYSQL : 사업으로하고 데이터베이스를 설정하여

비즈니스 로직에 의해 교착 상태를 해결하려면

  • 지정된 락 취득 순서
  • 각각의 작은 거래로 큰 거래를 휴식
  • 동일한 트랜잭션에서, 많은 자원으로 잠금 및 교착 상태의 가능성을 감소
  • 테이블에 적절한 인덱스를 구축하고 트랜잭션 격리 수준을 줄이는 등

데이터베이스를 설정하여 교착 상태를 해결하려면

  • 시간 초과 매개 변수가 실제 비즈니스 시나리오 innodb_lock_wait_timeout을 기반으로 설정, 이노 엔진 기본값은 50입니다.
  • 교착 상태 감지를 시작 후, 우리는 다른 트랜잭션이 진행 그래서, 교착 상태, 트랜잭션을 롤백 체인 이니셔티브의 교착 상태를 발견했다. Innodb_deadlock_detect 파라미터 세트에에,이 논리 (ON 상태 기본값)에 표시됩니다.

"은 전체 테이블을 잠글 때 로우 레벨 잠금?"
이노 로우 레벨 잠금 업데이트 된 열은 그 전체 테이블을 잠근다 인덱싱되지 않은 경우, 인덱스 레코드 로크함으로써 달성된다.
여기에, 그물 떨어져 큰 수확 가축 감사합니다 .

의 MyISAM과 InnoDB의 각각의 애플리케이션 시나리오

  1. 의 MyISAM :
  • 자주 전체 테이블 카운트 문을 수행의 MyISAM은 테이블의 행 수를 보유하는 변수는 이렇게 빨리,이
  • 추가 및 삭제는 데이터의 효율이 높지 매우 자주 쿼리입니다 확인
  • 어떤 거래하지
  1. 이노 :
  • 삭제 변화 검색 데이터 (행 레벨 잠금 테이블 레벨 잠금 알 수있는) 매우 자주
  • 높은 신뢰성 요구 사항, 요구하는 지원 서비스

MySQL 데이터베이스 트랜잭션

데이터베이스 트랜잭션의 네 가지 특성

  • 원 자성 (Automic) : 트랜잭션에 포함 된 모든 작업 중 하나를 모두 실행되거나 모두 롤백 실패
  • 일관성 (일관성) : 서비스 확인해야합니다 다른 일관된 상태로 전환 한 일관성있는 상태에서 데이터베이스의 상태.
  • 절연 (절연) : 동시에 트랜잭션을 실행하는 여러 트랜잭션이 다른 트랜잭션의 실행에 영향을 미치지 않습니다
  • 영구 (내구성) : 트랜잭션이 커밋되면, 그는 영구적으로 데이터베이스에 저장해야 데이터베이스에 제출했다.

업무 문제 및 트랜잭션 격리 메커니즘 동시 액세스

트랜잭션 격리 수준

  • 확약 읽기 (읽기 커밋되지 않은) :

더러운 읽기 허용 . 트랜잭션 데이터를 쓰기 시작 된 경우, 추가 데이터를 동시에 쓸 수 있지만, 다른 트랜잭션이 여행의 데이터를 읽을 수 없습니다.

  • 커밋 된 읽기 (읽기 커밋) :

수 반복 할 수없는 읽기 ,하지만 더러운 읽습니다. 데이터 읽기 트랜잭션은 다른 트랜잭션이 데이터 행에 계속 액세스 할 수 있지만 행을 액세스하는 다른 트랜잭션을 방지 할 수 커밋되지 않은 트랜잭션을 작성할 수 있습니다.

  • 반복 읽기 (반복 읽기) :

금지 된 비 반복 읽기와 더러운 읽기 ,하지만 때로는 팬텀 읽기 나타날 수 있습니다. 데이터 읽기 트랜잭션이 쓰기 트랜잭션 (하지만 읽기 트랜잭션을 허용)에 의해 금지 될 것입니다, 쓰기 트랜잭션은 다른 트랜잭션을 금지합니다.

  • 직렬화 (직렬화) :

엄격한 트랜잭션 격리를 제공합니다 . 그것은 트랜잭션의 직렬화를 요구, 트랜잭션이 아니라 동시에보다, 하나에 의해 수행 될 수있다.

높은 트랜잭션 격리 수준은 더 나은 데이터의 무결성과 일관성을 보장하기 위해,하지만 동시 작업의 영향이 크다. MySQL의 기본 트랜잭션 격리 수준이 반복 읽기입니다.

방지하는 방법 트랜잭션에 의해 발생 동시 액세스 문제

  1. 업데이트 손실 : 두 개의 서로 다른 트랜잭션이 같은 데이터를하고 자신의 업무가 동시에 데이터를 수정할에서, 다음 트랜잭션이 덮어 쓰기 된 후 트랜잭션에 대한 업데이트를 제출하도록 업데이트 제출됩니다, 회사가해야 할이 사건을 제출하면서 업데이트는 업데이트를 손실 된 데이터의 결과로 덮어 씁니다. (MySQL은 데이터베이스 수준에있는 모든 트랜잭션 격리 수준은 피할 수)
  2. 더러운 읽기 : 다시 B 롤 일치하지 않는 데이터 트랜잭션 A를 결과 트랜잭션, 결과는 트랜잭션의 더러운, MySQL을의 InnoBD 피하기 위해 트랜잭션 격리 수준 이상 (READ-최선을 다하고 읽기 나타났다 때문에 트랜잭션이 커밋되지 않은 데이터 트랜잭션 B를 읽고 기본 격리 수준이다 REPEATABLE_READ )

격리 수준을 설정 :

SET SESSION TRANSACTION ISOLATION LEVEL read uncommited; 
  1. 비 반복 읽기, • 트랜잭션 그가 데이터베이스 데이터, 쿼리 또는 조작에 의해 여러 차례에 다른 수치 결과를 업데이트하지 않은 경우에 다른 트랜잭션이 데이터를 업데이트하기 때문에, 두 번 수행 위의 거래 (REPEATABLE_READ 트랜잭션 격리 수준을 제출한다 피할 수)
  2. 매직 독서 : N 기록, 읽기, 트랜잭션 B는 트랜잭션 과정에서 증가 (A)에 수행 할 때 트랜잭션이 판독, A는 거래 시간은 N + 1 개 항목을하게 읽어,이 상황은 마법이라고 읽어 보시기 바랍니다. (설정은 SERIALIZABLE 격리 수준에 환각과 같은 트랜잭션 A가 외모의 결과로, 피할 수처럼,이 분리의 가장 높은 수준이다)

반복 불가능한 읽기 및 팬텀 구별 읽어 구조적 변화 매직 판독 수단은 예를 들어, 숫자 변경, 비 반복 판독 판독 값 변경 수단.


다음과 같이 특정 요약 데이터베이스 레벨은 상기와 같은 문제점을 회피하기 :

트랜잭션 격리 수준 분실 갱신 더러운 읽기 비 반복 읽기 매직 읽기
확약 읽기 발생 발생 발생
커밋 된 읽기 발생 발생
반복 읽기 발생
직렬화

성능상의 이유로, 더 높은 트랜잭션 격리 수준이 더 높은 보안, 더 심각한 직렬화 된 실행,이 데이터베이스의 동시성의 정도를 감소시킬 것이다, 비즈니스를 기반으로 트랜잭션 격리 수준을 설정하는 것이 필요하다

두 가지 중요한 로그 모듈의 MySQL 데이터베이스

모든 업데이트 작업은 다음 레코드가 업데이트됩니다, 발견하고, 디스크에 다음 IO 비용을 다시 작성하고 매우 높은 것입니다 비용의 기록을 찾을 수있는 해당 조건에 따라 기록하는 경우 MySQL은 사용, 업데이트 작업은 매우 빈번하다. 그래서, 말을하는 것입니다 로깅 모듈이 있었다, 우리 업데이트 업데이트 작업 쓰기 디스크에있을 것입니다 정확한 시간에 로그를 작성하는 것입니다, 로그는 클라이언트로 결과의 구현을 업데이트됩니다.

바이너리 로그 (아카이브 로그)

  • 빈 로그는 로그 서버 계층, 모든 엔진이 사용될 수있다
  • 바이너리 로그 논리 로그 같은 UID = 1 라인이 "밥"로 일본어 논리 문장 양수인에게 데이터에 대한 새로운 값을 기록 여기서 본질적 흰색 SQL 문이 문 형태
  • 바이너리 로그는 로그 파일이 다음으로 전환됩니다 특정 크기에 기록되고 이전 로그를 덮어 쓰지 않습니다, 추가로 쓰기입니다.

바이너리 로그 로그 파일 형식 (문, 행, 혼합)

  1. 바이너리 로그 기록 된 문 포맷이 완료 SQL 문이며, 장점은 SQL 문은 부정확로 이어질 수 등 지금 () 함수 작은 로그 파일, 더 나은 성능, 단점도 분명하다, 즉, 가난한 정확성, 한 만남이다
  2. 바이너리 로그 로우 포맷 단점이 큰 것을 로그 파일의 장점은 데이터 기록의 정확성, 즉, 데이터 선 변화의 실제 데이터를 기록한다.
  3. 전면 양쪽의 혼합 형태 바이너리 로그 혼합형

대부분의 경우 정확성의 요구 사항이 1 위를 차지하기 때문에 대부분은 행 모델을 사용합니다.

리두 로그 (리두 로그)

  • 이노 엔진 고유 로그 모듈, 실제 로그가 변경 어떤 데이터 페이지에 기록되어 리두 로그
  • 네 개의 파일 세트로 구성 할 수있는 등의 고정 크기의 이노 리두 로그는 각 파일은 1 기가 바이트, 기가 바이트 다음 동작의 전체를 촬영할 수 로그를 재실행한다. 처음부터 서면, 그것은 쓰기 사이클의 시작 최종 뒷면에 기록됩니다.
  • 이노 디비 리두 로그는 데이터베이스 예외가 손실되지 않습니다 기록을 제출하기 전에,이 기능은 충돌 안전이라고, 다시 시작 후 발생 확인합니다.

SQL 쿼리 속도가 느린 조정 및 일부 다른 사소한 지식 : SQL 문에서 기술의 일부를 요약합니다 다음 MySQL의 요약으로, 인터뷰의 고주파 지점이있다

게시 10 개 원래 기사 · 원의 찬양 (22) · 전망 4895

추천

출처blog.csdn.net/bob_man/article/details/104382299