web-dev-qa-db-ja.com

Mysql ACIDは準拠していますか?

MysqlはPostgresqlによるとACIDに準拠していませんか?一部のブログでは、MysqlがACIDに準拠していないことがわかります。それは本当ですか?

ここでレプリケーションについて考えないでください。スタンドアロンについて考えてみましょう。MysqlACIDはどれほど効率的ですか。

Mysql-ACIDについての私の理解では。

A-不可分性(トランザクションのセットは、1つが失敗するとロールバックする必要があります。Yesはすべてがコミットされることを意味します。1つが失敗してもロールバックする必要はありません)。

I.E. Mysqlでサポートされている機能は次のとおりです。

  • トランザクションを開始します。 .....コミット;
  • auto_commit = 1;

C-一貫性。

(PK、FK、UK、NOT-NULL)。これは、データベースの関係と制約に準拠しています。親キーのインスタンスは、その子キーが削除された場合にのみ削除できます。

I-分離。ユーザーとユーザーのコミット状態の分離。

繰り返し可能な読み取りコミットされていない読み取りコミットされた読み取りシリアル化

D-耐久性。 DBがクラッシュした場合、innodbはiblogファイルからコミットされたトランザクションを適用してDBを回復し、コミットされていないトランザクションを破棄します。

この質問のソースについては、ここをクリックしてください。 -ブログが@ 2001で作成されたためですか?

UPDATE 2017年6月30日:「Evan Carroll」の応答に従って、私は5.7で blog 実験を個人的にテストしました。 18エンタープライズ。実験から得られた結果はMysqlはACIDに準拠していないようです

3
Mannoj

番号

リピータブルリードでファントムライトを許可しても、ACIDコンプライアンスは満たされないと思います。

詳細については、このブログのエントリを参照してください。

3
Evan Carroll

InnoDBまたは同様のストレージエンジンを使用する場合は、ACIDに準拠している必要があります(参照: https://en.wikipedia.org/wiki/InnoDB )。 myISAM、古いデフォルトであり、まだ非常に一般的に使用されていますが、間違いなくACID準拠ではありません。 2つを組み合わせると(ETLプロセスのステージングテーブルなど、単純なテーブルタイプの方がパフォーマンスがよく、再生成可能な揮発性データに適している場合があります)、ソリューションは完全に準拠しません。

ACID準拠の大きな警告は、パフォーマンス上の理由から、ほとんどのデータベースが「I」部分を保証しない分離レベルを使用することです。これはANSI SQL仕様の範囲内です。適切な分離を提供するには、トランザクションがシリアル化可能であることを保証する必要があります。これは、一部のDBではサポートされていない分離レベルです。たとえば、MySQL + InnoDBのデフォルトは「繰り返し可能な読み取り」ですが、MS SQL Serverのデフォルトは少し厳密な「コミットされた読み取り」ですが、どちらも「シリアライズ可能」を提供しますが、デフォルトではありません。が常にサポートされておらず、通常はデフォルトではないのはなぜですか?パフォーマンス:完全な分離要件により、同時実行性が大幅に制限される可能性があります。

この件に関しては良い記事がいくつかあります。一例として、 http://www.bailis.org/blog/when-is-acid-acid-rarely/ は、コメントで興味深いディスカッションを始めるための短くて有益な場所です。

7
David Spillett

MySQLが本当に完全にACIDプロパティをフォローしているかどうか、これについては多くの議論があり、誰もが独自の意見を持っています。 MySQLのドキュメントに従って https://dev.mysql.com/doc/refman/5.6/en/mysql-acid.html

MySQLとInnodbエンジンは、ACIDプロパティに厳密に従っていますが、それは彼らの見解です。

しかし、新しいバージョンでMySQLが大幅に改善されたことを忘れてはなりません。OracleがOracleを非常に良い方法で最適化していることを個人的に認めています。したがって、以前のバージョンはACIDに準拠していない可能性がありますが、現在はそうです。

ただし、すべてのプロパティを1つずつ配置して、MySQLとInnodbがこれらのプロパティをどのように追跡するかを見てみましょう。

  1. Atomicityは、ロールバックまたはコミットのいずれかを示します。私の経験によれば、トランザクションの途中でクラッシュが発生すると、Innodbエンジンはロールバックを実行します。トランザクションステートメントの結果(変更された行)をメモリバッファーに格納し、これらの結果をディスクとバッファーのバイナリログに書き戻すことで処理します。トランザクションがコミットされた後のみ。

  2. Consistencyは、データベースへのすべての変更を記録し、一貫性が発生しないことを保証するのに役立つさまざまなロギングメカニズムがあるため、MySQL Innodbでも追跡されました。

  3. Isolation:Innodbは、他のプロセスがすでに使用しているリソースのロックを取得する他のプロセスを回避する(適切に処理された場合)いくつかの行レベルのロックを提供します。トランザクションステートメントの結果(変更された行)をメモリバッファーに格納し、トランザクションがコミットされたときにのみ、これらの結果をディスクおよびバッファーからバイナリログに書き込むことによって処理します。

  4. 耐久性:MySQLと同様DOCACIDモデルの耐久性の側面には、特定のハードウェア構成と相互作用するMySQLソフトウェア機能。CPU、ネットワーク、およびストレージデバイスの機能に応じて多くの可能性があるため、この側面は、具体的なガイドラインを提供するのが最も複雑です(これらのガイドラインは、 「新しいハードウェア」を購入します。)また、MySQLは、障害発生時の耐久性を保証するバイナリログを提供します。

これがあなたを助けるなら、私に知らせてください:)

1
Ankit Kapoor

私の知識に基づいて、MySQLはACIDコンプライアンスです...ただし、この回答がより明確になることを願ってください ここにリンクの説明を入力してください

0
Osama Al-Banna