ホームページ  >  記事  >  データベース  >  MySQL のトランザクション分離メカニズムと実装原理の詳細な説明

MySQL のトランザクション分離メカニズムと実装原理の詳細な説明

WBOY
WBOY転載
2022-11-14 16:29:332034ブラウズ

この記事では、mysql に関する関連知識を提供します。主に、MySQL トランザクションの使用と長時間トランザクションのリスク、MySQL トランザクションとその特性、同時トランザクションの影響について紹介します。質問、トランザクション分離レベルについて説明します。とデモ、シングルバージョン管理ロックやマルチバージョン同時実行制御MVCCなどを一緒に見ていきましょう。

MySQL のトランザクション分離メカニズムと実装原理の詳細な説明

# 推奨学習:

mysql ビデオ チュートリアル

##1. MySQL トランザクションの使用法

1. トランザクションとは何ですか?

##トランザクションは、単一の論理的な作業単位として実行される一連の操作です。これらの操作のすべてが統合された作業単位であるか、まったく存在しないかのどちらかです。

たとえば、何かを支払うプロセスでは、残高を確認し、加算または減算し、残高を更新するという一連の操作が発生します。これらの操作は同時に行う必要があります。それ以外の場合は、支払いは成功したが、システムがお金を受け取らなかったことが表示されます。

#MySQL では、トランザクション サポートはエンジン層で実装されており、MyISAM エンジンはトランザクションをサポートしません

2. トランザクションの 4 つの特性

トランザクションになるには、論理作業単位がリレーショナル データベース管理システムの 4 つの特性を満たす必要があります。 いわゆる ACID: 原子性、一貫性、分離性、耐久性。

原子性

: トランザクションのすべての操作は完了または不完全であり、中間段階では終了しません。

一貫性 : トランザクションの前後でデータベースの整合性制限が破られることはありません。

分離: 複数のトランザクションがデータベース内の同じデータに同時にアクセスすると、関係が表示されます。

永続性 : トランザクションの完了後、トランザクションによって行われた変更は永続化され、失われることはありません。

ACID は、Redo および Undo ログを通じて保証する必要があります。 MySQL ログ システムの詳細説明: (後日追加)

3. MySQL トランザクションの使用法

MySQL には次の 2 つのトランザクション起動方法があります:

3.1. トランザクション ステートメントを明示的に開始する

begin またはトランザクションを開始します。一致するコミット ステートメントは commit で、ロールバック ステートメントは rollback です。
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. 自動送信をオフにする

set 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. 4 つの分離レベル

これらの問題を解決するために、MySQL は「分離レベル」の概念を導入しました。 分離レベルが高くなるほど効率は低下するため、多くの場合、この 2 つの間のバランスを見つける必要があります。 SQL 標準トランザクション分離レベルには、コミットされていない読み取り (読み取り) (コミットされていない読み取り)、コミットされた読み取り (読み取り) (コミットされた読み取り)、反復可能読み取り (反復可能読み取り)、およびシリアル化可能 (シリアル化可能) が含まれます。

Read Uncommitted

(

RU

、Read Uncommitted)。トランザクションの中間プロセスを読み取ることができます。 ACID プロパティに違反しており、ダーティ リードの問題があります。したがって、基本的には使用されず、無視して問題ありません。 Read Committed (

RC

、Read Committed)。これは、他のトランザクションがコミットされている場合、これが最も一般的に使用されるレベルでもあることがわかります。ただし、歴史的な理由により、RC は運用環境ではあまり使用されない可能性があります。 Repeatable Read (

RR

、Repeatable Read) は、現在最も広く使用されているレベルです。ギャップ ロック機能があり、これがまだデフォルト レベルです。このレベルでは、デッドロック、同時実行性の低下、その他の問題が頻繁に発生します。 Serialization (シリアル化可能) は、すべての実装がロックを通じて実装されているため、マルチバージョン実装ではなく、単一バージョン実装です。基本的には使用しないので無視して構いません。

2. 同時トランザクションによって引き起こされる問題

ダーティ リーディング: トランザクション A はトランザクション B によって更新されたデータを読み取り、その後 B はロールバックします。 A によって読み取られたデータはダーティです (実際には存在しないはずのデータ)

#Non-repeatable read: トランザクション A は同じデータを複数回読み取ります。トランザクション B は、トランザクション A の複数回の読み取り中にデータを更新およびコミットするため、トランザクション A が同じデータを複数回キャプチャすると、一貫性のない結果が生じます。

トランザクションが別のトランザクションによって送信されたデータを読み取るため、前後で 2 回読み取られたデータが異なります

幻读: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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.imで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。