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

推薦する

JSベースの手持ち連射機能+テキスト揺れ特殊効果コードの簡単実装

少し前にTikTokで揺れる連打が流行っていたので真似してみることにしました。さっそく効果をみてみま...

見栄えの良い CSS カスタム スタイル (タイトル h1 h2 h3)

レンダリングBlog Gardenでよく使われるスタイル /*タイトル h1 h2 h3 スタイル*...

MySQLでテーブルデータを削除する方法

MySQL でデータを削除する方法は 2 つあります。1 つは DELETE ステートメント、もう ...

element-uiのアップロードコンポーネントでファイルやその他のパラメータを転送する際の問題を分析する

最近、element-ui を統合したプロジェクトで vuethink を使用しました。以前は bo...

CSSのborder-radiusプロパティを使用して円弧を設定します

現象: divを一定の振幅で円、楕円などに変更する方法: CSSのborder-radiusプロパテ...

MySQLデータの挿入、更新、削除の詳細

目次1. 挿入2. 更新3. 削除1. 挿入 顧客に挿入( 顧客.顧客住所、 顧客.cust_cit...

Docker イメージ + nginx を使用して Vue プロジェクトをデプロイする方法

1. Vueプロジェクトのパッケージ化開発されたvueプロジェクトに次の名前を入力し、パッケージ化し...

ユニークインデックスの S ロックと X ロックによる MySQL デッドロック ルーチンの理解

「初心者向けソースコードからの MySQL デッドロック問題の理解」では、MySQL ソースコードを...

Dockerfileを使用して独自のイメージを作成する方法

1. 空のディレクトリを作成する $ cd /home/xm6f/dev $ mkdir myapp...

有名ウェブサイトのロゴにおすすめのフォント40選

世界で最も有名なウェブサイトのロゴデザインにはどんなフォントが使われているかご存知ですか?これらのフ...

要素 el-table テーブルの二次カプセル化 (テーブルの高さの調整付き)

序文会社でのインターンシップ中、フロントエンド開発にはvue+element-uiフレームワークを使...

Vue3 + TypeScript 開発の概要

目次Vue3 + TypeScript 学習1. 環境設定1.1 最新のVue scaffoldin...

Vue3における7種類のコンポーネント通信の詳細

目次1. Vue3コンポーネント通信方式2. Vue3通信の使い方2.1 小道具2.2 $エミット2...

Pengyou.com モバイル クライアントのダウンロード ページのデザイン共有 (画像とテキスト)

まずは簡単なデータを見てみましょう。 Googleが発表したレポートによると、 ①中国の都市の97%...

シンプルなアコーディオン効果を実現するjs

この記事では、アコーディオン効果を実現するためのjsの具体的なコードを参考までに共有します。具体的な...