事務のMYSQL記事

トランザクションの概要

私たちは、取引銀行振込・オペレーションの導入を検討する前に:

# 从id=1的账户给id=2的账户转账100元
# 第一步:将id=1的A账户余额减去100
UPDATE accounts SET balance = balance- 100 WHERE id = 1;
#第二步:将id=2的B账户余额加上100
UPDATE accounts SET balance = balance + 100 WHERE id = 2;

上の2つのSQL文が完全に実施されなければならない、または第二文の最初の実行が成功すると、実装が失敗したいくつかの理由で、最初の文は取り消されなければなりません。私たちは、データベース全体としての操作のように複数の文を機能します事务SQL文の指定を取り消すに呼ばれて回退データベースのトランザクションは、トランザクションのスコープ内のすべての操作はすべて成功するか、すべて失敗する可能性があることを確認することができます。

一般的には、トランザクションが持つACID4つの特性を:

  • :原子、原子、作業のアトミック単位としてすべてのSQL、またはすべての実行またはすべての実行されません。
  • C:一貫性、整合性は、トランザクションが完了した後、すべてのデータの状態が同じである、すなわち、Aが100でアカウントを減算し、その後、Bは100を加え考慮しなければなりません。
  • I:分離、単離、同時に実行する複数のトランザクションがある場合、各トランザクションは修正が他のトランザクションから単離されなければならないからなります。
  • D:期間、持続性、すなわち、トランザクションが完了した後に、データベースのデータを変更するには、永続ストアです。

単一のSQL文の場合は、データベースシステムが自動的にすべての実行または完全に実装され、私たちは、このトランザクションを呼び出すのいずれか、作業の原子単位として、それを削除します隐式事务

もちろん、我々はまた、トランザクションとして手動で複数のSQL文が実行されることができ、私たちは、このトランザクションを呼び出し显示事务、次のように、一般的な形式は次のとおりです。

#使用BEGIN开启一个事务,即试图把事务内的所有SQL所做的修改永久保存。
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
#使用COMMIT提交一个事务
BEGIN;UPDATE accounts SET balance = balance - 100 WHERE id = 1;UPDATE accounts SET balance = balance + 100 WHERE id = 2;COMMIT;
COMMIT;

トランザクション分離レベル

分離レベル ダーティリード(ダーティリード) 非反復可能読み取り(非反復可能読み取り) マジック読書(ファントムリード)
非コミット読み取り はい はい はい
コミット読みます - はい はい
反復可能読み取り - - はい
Serializableを - - -

非コミット読み取り

Read Uncommittedトランザクション分離レベルは、最低レベルです。この分離レベルでは、トランザクションがデータを読み込みますが、別のトランザクションがロールバックされた場合、別のアップデート後にトランザクションを提出しなかった場合、現在のトランザクションが汚れているデータを読み込み、これはダーティリード(ダーティリード)があります。

コミット読みます

Read Committed分離の低いレベル、トランザクションは問題非反復可能読み取り(非反復可能読み取り)が発生する可能性があります。

不可重复读手段、別のトランザクションが最初のトランザクションでは、その後、このデータを変更するために発生した場合、トランザクションが、終わっていないトランザクション、同じデータを複数回読んで、データの読み出しは、二回一致しない場合があります。

反復可能読み取り

Repeatable Read分離の低いレベル、トランザクションがマジックリーディング(ファントムリード)である問題が発生してもよいです。

幻读トランザクション、最初のクエリのレコードでは、無見つかっていますが、このレコードを更新しようとすると、実際に成功することができ、存在せず、再度同じレコードを読み取るために、魔法のように見える、ということを意味A。

Serializableを

Serializableこれは、最も厳しい分離レベルです。直列化分離レベルでは、すべてのトランザクションを順に実行され、従って、ダーティ・リード、非反復リード、ファントムリードは表示されません。

最高レベルのセキュリティを有する直列化分離レベル下のトランザクションが、トランザクションがシリアル実行ので、効率が大幅に低下するため、しかし、アプリケーションのパフォーマンスが大幅に低減されます。シーンが特に重要でない場合は、一般的にシリアライズ可能分離レベルを使用しないでください。

おすすめ

転載: www.cnblogs.com/goWithHappy/p/sql_transaction.html