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 で直接実行する方法

推薦する

Linux で nohup ログ出力が大きすぎる問題の解決方法の詳細な説明

最近、hadoop テスト クラスターで spark ストリーミング プログラムを実行し、その後、n...

MySQLインストール後のデフォルトデータベースの役割の詳細な説明

MySQL を学習すると、インストール後にいくつかのデフォルトのデータベースが付属していることに気付...

時間範囲効果を実現するためのJavaScript

この記事では、時間範囲効果を実現するためのJavaScriptの具体的なコードを参考までに紹介します...

ffmpeg コマンドラインを使用してビデオを変換するためのサンプルコード

この記事の本文を始める前に、まず ffmpeg プログラムをインストールする必要があります (Lin...

K8Sの5つのコントローラーの紹介と使用

目次k8sのコントローラータイプポッドとコントローラの関係デプロイメント(ステートレスアプリケーショ...

よく使われる HTML タグとその特徴の完全なリスト

まず、HTML タグのいくつかの特性を知っておく必要があります。 1. 「<keyword&g...

Vuexの役割についての深い理解

目次概要コンポーネント間でデータを共有する方法Vuex の原則の紹介Vuexはコンポーネントのグロー...

Docker で Confluence をデプロイするための完全な手順

Confluence は有料ですが、クラックして使用できます (購入が推奨され、正規版がサポートされ...

Bootstrap 3.0 学習ノート グリッドシステム事例

序文前回の記事では、主にグリッドシステムの基本原理を学び、簡単なケースを通してその原理を実践しました...

MySQL双方向バックアップの実装方法

MySQL 双方向バックアップはマスター-マスター バックアップとも呼ばれ、両方の MySQL サー...

Alibaba CloudがCloud Shieldから無料のSSL証明書(https)を申請

プロジェクトでは https サービスを使用する必要があるため、Alibaba Cloud では無料...

IEの送信フォームの記録履歴クリックリターン情報を実現するためのCSSスタイルコントロールはまだ残っています

これは主に CSS スタイルのコントロールと META タグです。コードをコピーコードは次のとおりで...

JSはBaidu Newsナビゲーションバーの効果を実現

この記事では、Baidu News Navigation Barの効果を実現するための具体的なJSコ...

Vue3 プロジェクトで WeChat 認証ログインをエレガントに実装する方法

目次序文準備する実装のアイデアコードについて要約する序文WeChat 認証ログインは、WeChat ...

実行後にdocker nginxにアクセスできない問題の解決策

## 1最近、docker デプロイメントを学習しており、当初は nginx を docker 化す...