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

推薦する

Web 開発チュートリアル クロスドメイン ソリューションの詳細な説明

序文この記事では、主にWeb開発のためのクロスドメインソリューションを紹介し、参考と学習のために共有...

Mysql SQL ステートメントのコメント

MySQL SQL ステートメントにコメントを追加できます。MySQL SQL ステートメントのコメ...

Linux で指定されたフォルダの各サブフォルダ内のファイル数を表示する

カウントスクリプト #!/bin/sh 引数の数=$# [ $numOfArgs -ne 1 ]の場...

三角形を描画するための CSS 実装コード (border メソッド)

1. 単純な三角形を実装するCSS ボックス モデルの境界線を使用すると、次のような三角形を実現で...

MySql 5.6.36 64 ビット グリーン バージョンのインストール グラフィック チュートリアル

MySQL のインストールについてはインターネット上に多くの記事がありますが、今日ノート PC にイ...

DockerにJava環境をインストールするための実装手順

この記事は Linux centos8 をベースにして、docker をインストールし、イメージをプ...

DockerでHadoopを実行しイメージを作成する方法

車輪の再発明として、ここでは再パッケージ化を使用して Docker ベースの Hadoop イメージ...

Vite2.x に基づく Vue 3.x プロジェクトの実装

Vue 3.x プロジェクトの作成 npm init @vitejs/app my-vue-app ...

MySQL の悲観的ロックと楽観的ロックの理解と応用分析

この記事では、例を使用して MySQL の悲観的ロックと楽観的ロックについて説明します。ご参考までに...

Vue.js スロットにおけるスコープ付きスロットの使用法の詳細な説明

目次スロットなしVue2.x スロットスロット付き名前付きスロットスロット属性なしスロットの簡単なサ...

MySQL データ型 DECIMAL の使用方法の詳細な説明

MySQL DECIMALデータ型は、データベースに正確な数値を保存するために使用されます。会計シス...

インターネット接続なしでLinux Centos7にアプリケーションをインストールする方法の詳細な説明

1. 前の章では、プログラムを yum リポジトリに直接インストールできることを学びましたが、そのた...

webpackのモバイル適応ソリューションの概要

目次レムフォルクスワーゲンサードパーティのUIフレームワークに適応する結論モバイル開発における最も一...

Vue における ref と $refs の紹介と使用例

序文JavaScript では、document.querySelector("#demo...