select @@session.tx_read_only が DB に大量に出現するのはなぜですか?

select @@session.tx_read_only が DB に大量に出現するのはなぜですか?

問題を見つける

上位の SQL ステートメントを取得すると、DB が大量のselect @@session.tx_read_onlyステートメントを実行していることがわかりました。このステートメントは、ほぼすべての DML ステートメントの前に表示されました。しかし、アプリケーション層では特別な処理は行われないので、この SQL 文の目的は何でしょうか?誰がそれを実行したのですか?

詳しい紹介

この SQL の主な機能は、トランザクションが読み取り専用トランザクションであるかどうかを判断することです。 MySQL 自体は読み取り専用トランザクションを最適化しますが、これは MySQL バージョン 5.6.5 以降でのみ表示されます。 http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_tx_read_only

MySQLドライバパッケージを見つける

接続実装.java:


ご覧の通り、if 条件では MySQL のバージョンが判定されており、さらに!getUseLocalSessionState()条件があり、これは JDBC パラメータ useLocalSessionState に対応しています。この値が false の場合には、 select @@session.tx_read_onlyが発行されます。

デフォルトでは、接続文字列情報には useLocalSessionState パラメータの設定が含まれず、この値はデフォルトで false になります。

この値は、ドライバーが autocommit、read_only、およびトランザクション分離の内部値 (JDBC 側のローカル値) を使用するかどうかを決定します。

false に設定されている場合、これらの 3 つのパラメータを判断する必要があるシナリオでは、ステートメントを更新する前など、リモート要求にステートメントを送信する必要があります。

セッションが読み取り専用かどうかを確認するには、 select @@session.tx_read_onlyステートメントを発行する必要があります。

true に設定すると、ローカル値のみを取得する必要があります。これにより、一部のインスタンスにselect @@session.tx_read_onlyステートメントが多数含まれる理由を説明できます。

通常、ドライバーはローカル値がリモート サーバー値と一致していることを確認できます。アプリケーションが setAutoCommit、setTransactionIsolation、setReadOnly インターフェイスを呼び出してパラメータ値を設定すると、リモート サーバーと同期されます。

具体的には、

useLocalSessionState が true の場合、値がローカル値と一致しない場合は、リモート更新に送信されます。

useLocalSessionState が false の場合、設定された値がローカル値と一致しているかどうかに関係なく、毎回リモート更新に送信されます。これは、一部のインスタンスに autocommit ステートメントがさらに多く設定されている理由を説明できるかもしれません。

ただし、ユーザーが JDBC インターフェイス (setAutoCommit など) を介してパラメータを設定せずに、句'set autocommit=xxx'すると、ローカル値とリモート値の間に不整合が生じ、パラメータ useLocalSessionState が変更された後にビジネス ロジックが変更される可能性があります。

関連設定 SQL ステートメント:

set autocommit=0 /*セッションの自動コミットモードを設定する*/ 対応するJDBCインターフェース: setAutoCommit(false)
set tx_isolation='read-committed' /*トランザクション分離レベルを設定する*/ 対応するJDBCインターフェース: setTransactionIsolation('read-committed') 
set tx_read_only=0; /*読み取り専用トランザクションを設定する*/ 対応するJDBCインターフェース: setReadOnly(false)

useLocalSessionState のデフォルト値を true に設定すると、ビジネス ロジックの意味が変わる可能性があります。トリガー条件は、ユーザーが SQL ステートメントを通じて自動コミット パラメータ、分離レベル パラメータ、または読み取り専用トランザクション パラメータを直接設定することです。

要約する

上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM を応援していただきありがとうございます。

以下もご興味があるかもしれません:
  • DB2 SELECT ステートメントの高度な使用法

<<:  JS ES6コーディング標準の詳細な説明

>>:  Python スクリプトを Ubuntu で直接実行する方法

推薦する

SQL の左結合と右結合の原理と例の分析

テーブルが 2 つあり、テーブル A のレコードがテーブル B に存在しない可能性があります。左結合...

http-proxy-middlewareを使用してNodeでプロキシクロスドメインを実装する方法と手順

目次1. プロキシモジュールをインストールする2. プロキシを設定する1. プロキシモジュールをイン...

VUEトークンの無効化プロセスの詳細な説明

目次ターゲット思考分析コード着陸要約するターゲットトークンの有効期限切れシナリオの処理トークンは、ユ...

CocosCreator 学習モジュールスクリプト

Cocos Creator モジュラースクリプトCocos Creator を使用すると、コードを複...

MySQLデータベース操作の基本コマンド

1. データベースを作成します。 データ data _name を作成します。 PHP でデータベー...

MySQL における識別子の大文字と小文字の区別の問題の詳細な分析

MySQL では、テーブル名の大文字と小文字の区別の問題が発生する可能性があります。実際、これはプラ...

docker インストール後に hello-world を実行する問題を解決する

yumを使用してcentos7.3にDocker V1.13.1をインストールしましたしかし、doc...

dns-prefetch とは何ですか? フロントエンドの最適化: DNS の事前解決によりページ速度が向上します

目次背景1. dns-prefetch とは何ですか? 2. dns-prefetch を設定するに...

favicon.ico についていくつか注意点があります (ルートディレクトリに置くのがベストです)

任意のウェブページを開きます。例: http://www.baidu.com/ ブラウザのタブのヘッ...

Vue でスクロールバーのスタイルを変更する方法

目次まず、スクロール バーのスタイルを変更するには、疑似要素-webkit-scrollbarを使用...

JS配列ループ方式と効率分析の比較

配列メソッドJavaScript には多くの配列メソッドが用意されています。次の図は、ほとんどの配列...

モバイル端末での Vue2.x Picker のグローバル呼び出し実装

目次ピッカーコンポーネントとはピッカーコンポーネントの問題解決オプションの説明解決ディレクトリ部門P...

Spark RDD をデータフレームに変換し、それを MySQL に書き込む例

DataframeはSpark 1.3.0で導入された新しいAPIで、Sparkで大規模な構造化デー...

Hyper-V インストール CentOS 8 の問題の分析

CentOS 8 がリリースされてから随分経ちました。Linux 仮想マシンをいじっている人間として...

MySQL COUNT関数の使用と最適化

目次COUNT 関数は何をするのですか? MyISAMの「魔法」シンプルなCOUNT最適化近似値を使...