MySQLトリガーまたはトランザクションを使用していますか?
-
16-10-2019 - |
質問
WebサイトでMySQLトリガーまたはトランザクションを使用することについて、あなたの意見を聞きたいと思います。
実際、私には歴史があります payment
テーブル - UserId | OperationId | Comment | Credits | Sign (debit or credit)
. 。そのため、各支払い操作がこのテーブルに挿入されます。
ただし、アクションを実行するたびに、ユーザーの合計クレジット額を計算するたびに時間がかかります。だから、ユーザーの各ユーザーの合計クレジット額を維持するのは良い考えだと思いました profile
テーブル。
これが問題です。総クレジット額が形成されることをどのように確認できますか profile
テーブルは、操作と同期し続けます payment
歴史テーブル?
2つの方法を使用すると思いました:
- mysqlトリガーまたは
- ソースコードでコーディングされたトランザクション
どちらがより信頼できますか?大規模なデータベース(100.000人以上のユーザー)がある場合はどうなりますか?
これを行うための提案はありますか?
BD MySQLエンジンはINNODBです。
解決
間違いなく、私はトリガーを除外し、厳密に取引にとどまります。
トリガーは、本質的に、ストアドプロシージャです。彼らの行動は、ロールバックするのが事実上難しいです. 。基礎となるすべてのテーブルがINNODBであっても、比例したボリュームの共有行ロックと、排他的な行ロックからの迷惑な断続性が発生します。トリガーがテーブルを操作していた場合はそうです 挿入と更新が停滞して、各コール内でトリガーにヘビーデューティMVCCを実行する.
これをその事実と組み合わせてください 適切なデータ検証プロトコルは、MySQLのストアドプロシージャ言語に実装されていません. ストアドプロシージャ言語がトランザクション環境を処理できる場合、ビジネスインテリジェンスはデータベースに含まれていても問題ありません. 。 MySQL DBAとして、私はそれがMySQLの場合はそうではないと正直に言わなければなりません。 Oracle(PL/SQL)、PostgreSQL(PL/PGSQL)、およびSQL Server(T-SQL)は、MySQLに対してこのエッジを持っています。
トランザクションに関して、MySQLにはInnoDBがその主要な酸に準拠したストレージエンジン(MySQL 5.5の難聴ストレージエンジン)として搭載されています。クラッシュの回復が優れており、酸コンプライアンスプロトコルに従います。
毎回トリガーよりもトランスアシトンを選択します。
他のヒント
私はローランドの評価に同意します。ビジネスロジックはアプリケーションに存在する必要があり、データベースをトランザクション的に変更する必要があります。
もちろん、100,000人のユーザーにスケーリングすることは、アプリケーションと生成するデータベーストラフィックに依存します。 MySQLが重いトランザクション書き込み負荷の下にある場合、許容可能なアプリケーション応答を維持するために、データセットのシャードの負担にすぐに直面する可能性があります。
ただし、mysqlを破壊する代替品があります。それらの1つはです Clustrix (私の雇用主)これは、並列スケーラブルな高性能シングルインスタンスSQLデータベースシステムです。これは、単一のMySQLサーバーとしての地位を示すクラスター化されたデータベースシステムです。このスレッドで説明されているデータベースを、Clustrixの単一インスタンスで100,000人のユーザーにシームレスにスケーリングするには、シャードや追加のアプリケーションロジックが必要ありません。
ローランドからの良い答え。
さらに、トリガーはロジックに使用しないでください。いくつかの相互関係トリガーが後で、物事は速く混乱するからです。ストアドプロシージャまたはクライアント側の手順における優れた一連の指示は、データベース内の隠されたロジックの束よりも明確にビジネスロジックを把握することができます。また、トリガーされたテーブルに関するトリガーには制限があります。したがって、2つの異なる場所でロジックを分割していることに気付くかもしれません。
さらに - これらの計算がビジネスロジックサーバーで発生する時点で最適化する方法を見つけるかもしれませんが、トリガーは毎回トリガーされます。トリガーをオフにし、テーブルを更新してからトリガーを再有効にすることになります。これは、トリガーロジックを入れる必要があることを意味します。 それ コード。
さらに、コードのビジネスロジック部分のすべてのロジックを使用する必要はありません。ストアドプロシージャを使用して、テーブルの整合性を実施することをお勧めします。これにより、トランザクションを開始し、複数の更新を実行し、何かが失敗した場合に物事がうまくロールバックできます。そうすれば、データベースを見ている人は、たとえば注文を挿入するためのロジックを見ることができます。 WebサービスはDBへの単一のアクセスインターフェイスになる可能性があるため、これは今日の世界ではそれほど重要ではありません。しかし、複数の実行可能ファイルがDBにアクセスできる場合、これは巨大になる可能性があります。
さらに、とにかくトランザクションがあります - トリガーなしでトリガーを実行するつもりはありません...正しいですか?したがって、トランザクションを開始する方法を知っているのは良いことです。いくつかのことをしてください。そして、トランザクションを終了します。コードにこのパターンが表示された場合、それを使用するもう1つのコードは、認知負荷に軽いものになります。トリガーは、それがそこにあることを覚えている場合、特に他のテーブルが引き出される可能性がある場合、トリガーの影響を受けるトランザクションについては、違った考え方を強要します。
基本的に、定期的にスケジュールされたCronジョブ(またはデータベースエージェントジョブ)と優れたストアドプロシージャの間で、必要なものの99%を達成できます。 1%;プロジェクトを再考します。