MySQLの4つのトランザクション独立性レベル
3458 ワード
孫玄:すべての業務を投げ出すアーキテクチャ設計はごろつきです.58同城システムアーキテクチャ師すべての業務を投げ出す面接はごろつきです.
1、概念
トランザクション:一部のビジネス要件では、一連の操作をすべて実行する必要がありますが、一部のみを実行することはできません.たとえば、複数のSQLを実行する場合、テーブル・データを更新するには2つのSQLを同時に実行する必要があります.トランザクションはこの問題を解決するためです.例えば、共有機能業務では、ポイント記録表と顧客情報表を同時に更新する必要がある.暗黙的なトランザクション:単一のSQL文の場合、データベース・システムは自動的にトランザクションとして実行します.明示的なトランザクション:複数のSQL文がトランザクションとして実行されます.注意:M y s q lトランザクション要件はI n n o D Bストレージエンジンでなければなりません.このエンジンはM y S Q Lデフォルトエンジンです.注意:Mysqlトランザクション要件はInnoDBストレージエンジンでなければなりません.このエンジンはMySQLデフォルトエンジンです.注意:Mysqlトランザクション要件はInnoDBストレージエンジンでなければなりません.このエンジンはMySQLデフォルトエンジンの具体的な例です.
トランザクションを使用しない場合:SQL 2の実行に失敗した場合、トランザクションが開始される前の状態に戻すことができないため、汚れたデータが発生しないようにトランザクションを追加する必要があります.
2、取引のACID特性
1、原子性(Atomicity):複数のSQLを原子として実行するか、すべて実行に成功するか、失敗したSQLがある場合はすべてトランザクション開始前の状態にロールバックする.2、コンシステンシ(Consistency):トランザクションが完了すると、すべてのデータの状態が一致します.すなわち、A口座から100を差し引くと、B口座には必ず100が加算されます.3、独立性(Isolation):この取引の実行中、各取引の修正は他の取引と完全に独立しており、外部には影響がありません.例えば、第1のSQLの実行結果は第2のSQLでクエリーできません.取引が提出された後、他の取引だけが最新のデータをクエリーすることができます.4、持続性(Durability):トランザクションが完了すると、データの変更は永続的に保存され、ダウンタイムが発生してもデータは保存されます.
3、取引の同時問題
2つの同時実行トランザクションについて、同じレコードのSQLを操作する場合、ダーティリード、重複不可リード、幻リードなどの問題が発生する可能性があります.1、ダーティ・リード:あるトランザクションは別のトランザクションの更新後にコミットされていないデータを読み、別のトランザクションがロールバックされると、現在のトランザクションが読み取ったデータはダーティ・データであり、これがダーティ・リード(Dirty Read)である.2、繰り返し不可:一つの事務の中で二つのSQLは同じデータを読み、一つ目のSQLを読み終わってからまだ読み始めていない時、もう一つの事務がちょうどこのデータを修正した場合、一つ目の事務の中で二回目のデータが一致しない可能性がある.3、幻読:あるトランザクションで、あるレコードを初めてクエリーして発見したが、この存在しないレコードを更新しようとしたとき、意外にも成功し、同じレコードを再び読み取ることができ、不思議に現れた.小結:再読不可と幻読は混同されやすく、再読不可は修正に重点を置き、幻読は新規または削除に重点を置く.再読み取り不可の問題を解決するには、条件を満たす行をロックするだけで、幻読み取りを解決するにはロックテーブルが必要です.
4、MySQLトランザクション独立性レベル
読み取りコミットなし:Read Uncommittedは、独立性レベルが最も低いトランザクション・レベルです.この独立性レベルでは、あるトランザクションは別のトランザクションの更新後にコミットされていないデータを読み、別のトランザクションがロールバックされると、現在のトランザクションが読み込んだデータはダーティデータであり、これがダーティリード(Dirty Read)である.繰り返し不可:Read-committedとは、1つのトランザクション内で同じデータを複数回読み出すことです.このトランザクションがまだ終了していない場合、別のトランザクションがこのデータを適切に変更した場合、最初のトランザクションで2回読み込んだデータが一致しない可能性があります.繰り返し可能:Repeatable Read独立性レベルでは、トランザクションが幻読み(Phantom Read)の問題に遭遇する可能性があります.シリアル化:Serializableは最も厳格な独立性レベルです.Serializable独立性レベルでは、すべてのトランザクションが順番に実行されるため、汚れた読み取り、繰り返し不可能な読み取り、幻の読み取りは発生しません.トランザクション独立性レベルダーティリード繰り返し不可幻リード未コミット(read-uncommitted)Yes Yes Yes Yes Yes Yes Yes Yes Yes No Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes No No No No No No No No No No No No No No No No No No No No No
mysqlデフォルトのトランザクション独立性レベルはrepeatable-read mysqlデフォルトのトランザクション独立性レベルを表示します.
現在のトランザクション・モードをコミットされていない読み取りに設定します.
現在のトランザクション・モードをコミット済みの読み取りに設定します.
現在のトランザクション・モードを繰り返し読み取り可能に設定します.
その他
1、概念
トランザクション:一部のビジネス要件では、一連の操作をすべて実行する必要がありますが、一部のみを実行することはできません.たとえば、複数のSQLを実行する場合、テーブル・データを更新するには2つのSQLを同時に実行する必要があります.トランザクションはこの問題を解決するためです.例えば、共有機能業務では、ポイント記録表と顧客情報表を同時に更新する必要がある.暗黙的なトランザクション:単一のSQL文の場合、データベース・システムは自動的にトランザクションとして実行します.明示的なトランザクション:複数のSQL文がトランザクションとして実行されます.注意:M y s q lトランザクション要件はI n n o D Bストレージエンジンでなければなりません.このエンジンはM y S Q Lデフォルトエンジンです.注意:Mysqlトランザクション要件はInnoDBストレージエンジンでなければなりません.このエンジンはMySQLデフォルトエンジンです.注意:Mysqlトランザクション要件はInnoDBストレージエンジンでなければなりません.このエンジンはMySQLデフォルトエンジンの具体的な例です.
CREATE TABLE
bank(NAME VARCHAR(20),money DECIMAL(5,1))
ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO bank VALUES('shaotuo',1000),('laohu',5000);
START TRANSACTION; //
UPDATE bank SET money=money+500 WHERE NAME='shaotuo'; //SQL1
UPDATE bank SET moey=money-500 WHERE NAME='laohu'; //SQL2
ROLLBACK; //
COMMIT; // commit( commit,sql )
トランザクションを使用しない場合:SQL 2の実行に失敗した場合、トランザクションが開始される前の状態に戻すことができないため、汚れたデータが発生しないようにトランザクションを追加する必要があります.
2、取引のACID特性
1、原子性(Atomicity):複数のSQLを原子として実行するか、すべて実行に成功するか、失敗したSQLがある場合はすべてトランザクション開始前の状態にロールバックする.2、コンシステンシ(Consistency):トランザクションが完了すると、すべてのデータの状態が一致します.すなわち、A口座から100を差し引くと、B口座には必ず100が加算されます.3、独立性(Isolation):この取引の実行中、各取引の修正は他の取引と完全に独立しており、外部には影響がありません.例えば、第1のSQLの実行結果は第2のSQLでクエリーできません.取引が提出された後、他の取引だけが最新のデータをクエリーすることができます.4、持続性(Durability):トランザクションが完了すると、データの変更は永続的に保存され、ダウンタイムが発生してもデータは保存されます.
3、取引の同時問題
2つの同時実行トランザクションについて、同じレコードのSQLを操作する場合、ダーティリード、重複不可リード、幻リードなどの問題が発生する可能性があります.1、ダーティ・リード:あるトランザクションは別のトランザクションの更新後にコミットされていないデータを読み、別のトランザクションがロールバックされると、現在のトランザクションが読み取ったデータはダーティ・データであり、これがダーティ・リード(Dirty Read)である.2、繰り返し不可:一つの事務の中で二つのSQLは同じデータを読み、一つ目のSQLを読み終わってからまだ読み始めていない時、もう一つの事務がちょうどこのデータを修正した場合、一つ目の事務の中で二回目のデータが一致しない可能性がある.3、幻読:あるトランザクションで、あるレコードを初めてクエリーして発見したが、この存在しないレコードを更新しようとしたとき、意外にも成功し、同じレコードを再び読み取ることができ、不思議に現れた.小結:再読不可と幻読は混同されやすく、再読不可は修正に重点を置き、幻読は新規または削除に重点を置く.再読み取り不可の問題を解決するには、条件を満たす行をロックするだけで、幻読み取りを解決するにはロックテーブルが必要です.
4、MySQLトランザクション独立性レベル
読み取りコミットなし:Read Uncommittedは、独立性レベルが最も低いトランザクション・レベルです.この独立性レベルでは、あるトランザクションは別のトランザクションの更新後にコミットされていないデータを読み、別のトランザクションがロールバックされると、現在のトランザクションが読み込んだデータはダーティデータであり、これがダーティリード(Dirty Read)である.繰り返し不可:Read-committedとは、1つのトランザクション内で同じデータを複数回読み出すことです.このトランザクションがまだ終了していない場合、別のトランザクションがこのデータを適切に変更した場合、最初のトランザクションで2回読み込んだデータが一致しない可能性があります.繰り返し可能:Repeatable Read独立性レベルでは、トランザクションが幻読み(Phantom Read)の問題に遭遇する可能性があります.シリアル化:Serializableは最も厳格な独立性レベルです.Serializable独立性レベルでは、すべてのトランザクションが順番に実行されるため、汚れた読み取り、繰り返し不可能な読み取り、幻の読み取りは発生しません.トランザクション独立性レベルダーティリード繰り返し不可幻リード未コミット(read-uncommitted)Yes Yes Yes Yes Yes Yes Yes Yes Yes No Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes No No No No No No No No No No No No No No No No No No No No No
mysqlデフォルトのトランザクション独立性レベルはrepeatable-read mysqlデフォルトのトランザクション独立性レベルを表示します.
SELECT @@tx_isolation;
現在のトランザクション・モードをコミットされていない読み取りに設定します.
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
現在のトランザクション・モードをコミット済みの読み取りに設定します.
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED
現在のトランザクション・モードを繰り返し読み取り可能に設定します.
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
その他