MySQL의 상세한 트랜잭션 격리 메커니즘 및 구현 원칙

WBOY
풀어 주다: 2022-11-14 16:29:33
앞으로
2015명이 탐색했습니다.

이 기사에서는 MySQL 트랜잭션의 사용과 장기 트랜잭션의 위험, MySQL 트랜잭션과 그 특성, 동시 트랜잭션으로 인해 발생하는 문제, 트랜잭션 격리 수준 및 데모, 단일 버전 제어 잠금을 주로 소개하는 mysql에 대한 관련 지식을 제공합니다. 및 다중 버전 동시성 제어 MVCC 등을 함께 살펴보겠습니다. 모두에게 도움이 되기를 바랍니다.

MySQL의 상세한 트랜잭션 격리 메커니즘 및 구현 원칙

추천 학습: mysql 비디오 튜토리얼

1. MySQL 트랜잭션 사용법

1. 트랜잭션이란 무엇입니까

트랜잭션은 단일 논리적 작업 단위로 수행되는 일련의 작업입니다. 이러한 작업은 전부 또는 전혀 통합되지 않은 작업 단위입니다.

예를 들어, 결제 과정에서는 잔액 확인, 가감, 잔액 업데이트 등 일련의 작업이 발생합니다. 이러한 작업은 동시에 이루어져야 합니다. 그렇지 않으면 결제가 성공했지만 시스템이 돈을 받지 못한 것으로 표시됩니다.MyISAM 엔진은 트랜잭션을 지원하지 않습니다. 트랜잭션, 논리적 작업 단위는 관계형 데이터베이스 관리 시스템의 네 가지 특성을 충족해야 합니다.

소위 ACID: 원자성, 일관성, 격리성 및 내구성.

원자성: 트랜잭션의 모든 작업은 완료되거나 불완전하며 중간 단계에서 끝나지 않습니다.

Consistency

: 트랜잭션 전후에 데이터베이스의 무결성 제한이 깨지지 않습니다.

Isolation: 여러 트랜잭션이 동시에 데이터베이스의 동일한 데이터에 액세스하면 관계가 표시됩니다.

지속성: 거래가 완료된 후에도 거래로 인한 변경 사항은 유지되며 손실되지 않습니다.

ACID는 Redo 및 Undo 로그를 통해 보장되어야 합니다. MySQL 로그 시스템에 대한 자세한 설명: (추후 보완 예정)

3. MySQL 트랜잭션 사용법

MySQL에는 다음 두 가지 트랜잭션 시작 방법이 있습니다.

3.1 명시적으로 트랜잭션 문 시작

begin 또는 start transaction. 일치하는 커밋 문은 커밋이고 롤백 문은 롤백입니다.

BEGIN -- 开启事务
START TRANSACTION -- 开启事务

INSERT INTO fork_business_detail VALUES ( 4, '123', '123', '123004', '2022-11-12 17:17:29', '1', '2022-11-12 17:17:37', '1' );

COMMIT -- 提交事务

ROLLBACK -- 回滚事务
로그인 후 복사

3.2. 자동 제출 끄기

autocommit=0으로 설정하면 이 명령은 이 스레드의 자동 제출을 끄게 됩니다. 즉, select 문만 실행하면 트랜잭션이 시작되고 자동으로 커밋되지 않습니다. 이 트랜잭션은 커밋 또는 롤백 문을 적극적으로 실행할 때까지 또는 연결을 끊을 때까지 지속됩니다. (권장하지 않음!)

set autocommit=0 -- 关闭自动提交

INSERT INTO fork_business_detail VALUES ( 4, '123', '123', '123004', '2022-11-12 17:17:29', '1', '2022-11-12 17:17:37', '1' );

COMMIT -- 提交事务

ROLLBACK -- 回滚事务
로그인 후 복사

2. MySQL 트랜잭션 격리 및 격리 메커니즘

데이터베이스에서 여러 트랜잭션이 동시에 실행될 때(멀티 태스킹, 동시 시나리오로 이해 가능) 더티 읽기 및 사용할 수 없는 트랜잭션 반복 읽기 및 팬텀 읽기가 발생할 수 있습니다.

1. 네 가지 격리 수준

이러한 문제를 해결하기 위해 MySQL은 "격리 수준"이라는 개념을 도입합니다.

격리 수준이 높을수록 효율성은 낮아지는 경우가 많습니다. 이 둘 사이의 균형을 찾아야 합니다. SQL 표준 트랜잭션 격리 수준에는 커밋되지 않은 읽기(읽기)(커밋되지 않은 읽기), 커밋된 읽기(읽기), 커밋된 읽기(커밋된 읽기), 반복 가능한 읽기(반복 가능한 읽기) 및 직렬화 가능(직렬화 가능)이 포함됩니다.

Read Uncommitted(

RU

, Read Uncommitted), 트랜잭션의 중간 프로세스를 읽을 수 있습니다. ACID 속성을 위반하고 더티 읽기 문제가 있습니다. 따라서 기본적으로 사용되지 않으며 무시해도 됩니다.

Read Committed

(RC, Read Committed), 이는 다른 트랜잭션이 커밋된 경우에도 이 수준이 가장 일반적으로 사용되는 수준임을 알 수 있습니다. 그러나 몇 가지 역사적인 이유로 인해 프로덕션 환경에서는 RC가 많이 사용되지 않을 수 있습니다.

반복 읽기

(RR, 반복 읽기)는 현재 가장 널리 사용되는 수준입니다. 여전히 기본 수준인 간격 잠금 기능이 있습니다. 이 수준에서는 교착 상태, 낮은 동시성 및 기타 문제가 자주 발생합니다.

Serialized

(직렬화 가능)는 다중 버전 구현이 아니라 단일 버전 구현입니다. 모든 구현이 잠금을 통해 구현되기 때문입니다. 기본적으로 사용되지 않으며 무시할 수 있습니다. 2. 동시 트랜잭션으로 인한 문제

Dirty read: 트랜잭션 A가 트랜잭션 B가 업데이트한 데이터를 읽은 후 B가 롤백하므로 A가 읽은 데이터가 더티(실제로 존재해서는 안 되는 데이터)입니다.

반복 불가능한 읽기: 트랜잭션 A는 동일한 데이터를 여러 번 읽습니다. 트랜잭션 B는 트랜잭션 A를 여러 번 읽는 동안 데이터를 업데이트하고 커밋하므로 트랜잭션 A가 동일한 데이터를 여러 번 캡처할 때 일관성 없는 결과가 발생합니다.

트랜잭션이 다른 트랜잭션에서 제출한 데이터를 읽으므로 다른 데이터를 두 번 읽게 됩니다

幻读:A查出来数据,此时B提交,A再次查同一数据时结果不一致。一个事务前后两次读取的数据不一致,是因为其他事务插入数据导致的事务并发情况

不可重复读和幻读很容易混淆,不可重复读侧重于修改,而幻读侧重于添加或删除。要解决不可重复读取的问题,只需要符合条件的行,而要解决幻读问题需要锁表

3、隔离级别问题剖析与演示

3.1 查看mysql事务隔离级别

SELECT @@transaction_isolation; -- 查看mysql事务隔离级别
SELECT @@tx_isolation;          -- 查看mysql事务隔离级别
로그인 후 복사

3.2、脏读问题

将事务隔离级别修改为读未提交,可以看到,事务还没有提交,这时候去查询这条数据,发现数据已经可见了。

set session transaction isolation level read uncommitted; -- 设置成读未提交
SELECT @@tx_isolation;          -- 查看mysql事务隔离级别

START TRANSACTION -- 事务A
INSERT INTO fork_business_detail VALUES ( 4, '123', '123', '123004', '2022-11-12 17:17:29', '1', '2022-11-12 17:17:37', '1' );
ROLLBACK

select * from fork_business_detail where id= 4 -- 事务B
로그인 후 복사

3.3、不可重复读

一个事务读取到其他事务已提交的数据导致前后两次读取数据不一样的情况。

select * from fork_business_detail where id= 4;

BEGIN; -- 开启事务
select * from fork_business_detail where id= 4;
UPDATE fork_business_detail set SUB_ODR_ID=123004 where id= 4;
COMMIT;

select * from fork_business_detail where id= 5;
로그인 후 복사

三、MySQL事务实现原理

1、单版本控制——锁

serializable ,使用锁独占方式来确保只有一个版本时事务被隔离,因此锁可以理解为单版本控制。

在MySQL事务中,锁的实现与隔离级别有关。在RR(Repeatable Read)隔离级别下,MySQL使用间隙锁来防止以并行性为代价写入数据,以解决虚拟读取的问题。

这种类型的锁通常会导致死锁,因为它没有足够的并行性和许多冲突。现在流行的Row模式可以避免许多冲突甚至死锁,因此建议默认使用Row+RC(Read Committed)模式隔离级别,这可以大大提高数据库的读写并行性。

2、多版本控制MVCC

多版本控制,也称为MVCC,是指数据的多版本处理,以实现数据库中的高度并发数据访问,以及事务的可见性,以确保事务可以看到其应该看到的数据版本。

如何生成多个版本?

每次修改数据库时,撤消( Undo log)日志都会记录当前修改记录的事务号和修改前数据状态的存储地址(即ROLL_PTR),以便在必要时回滚旧数据版本。

例如,读取事务查询当前记录,但最近的事务尚未提交。根据原子性,读取事务无法看到最新的数据,但您可以在回滚段中找到旧版本数据,从而生成多个版本。

多版本控制巧妙地将独占和独占的稀有资源转换为并发,大大提高了数据库吞吐量和读/写性能。

推荐学习:mysql视频教程

위 내용은 MySQL의 상세한 트랜잭션 격리 메커니즘 및 구현 원칙의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:juejin.im
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!