Mysql 自动提交对查询带回的影响
Mysql 自动提交对查询带来的影响 在数据库应用编程中,通常为了修改语句的执行效率会将数据库的自动提交模式关闭,然后采用事务的方式提交更改。然后问题就来了,下面是一段被精简的程序,用的是Mysql C API: MYSQL *conn=mysql_init(NULL); mysql_real_conn
Mysql 自动提交对查询带来的影响在数据库应用编程中,通常为了修改语句的执行效率会将数据库的自动提交模式关闭,然后采用事务的方式提交更改。然后问题就来了,下面是一段被精简的程序,用的是Mysql C API:
MYSQL *conn=mysql_init(NULL); mysql_real_connect(conn,"198.120.0.199","shr","shr","sp5000",3306,NULL,0); int num = 2; char sql[512] = "select name from aaa"; MYSQL_STMT *stmt; MYSQL_BIND column[1]; mysql_autocommit(conn, 0); //设置自动提交关闭 stmt = mysql_stmt_init(conn); for(int jj=0;jj<100;jj++){ mysql_stmt_prepare(stmt,sql,strlen(sql); mysql_stmt_execute(stmt); memset(column,0,sizeof(column)); unsigned long length[1]; my_bool is_null[1]; char name[100]; column[0].buffer_type = MYSQL_TYPE_VAR_STRING; column[0].buffer =(char *)name; column[0].buffer_length = 100; column[0].is_null= &is_null[0]; column[0].length = &length[0]; mysql_stmt_bind_result(stmt,column); mysql_stmt_store_result(stmt); while(true){ rel=mysql_stmt_fetch(stmt); if(rel!=0) break; printf("data: %s \n",name); } getchar(); } mysql_stmt_free_result(stmt); mysql_stmt_close(stmt);
mysql默认是自动提交,通过 mysql_autocommit(conn, 0)将自动关闭关闭。在循环查询中发现每次查询的结果都一样!尽管在其他地方修改了这张表并提交成功,当然每次程序重新启动的第一次还是能正确读取到数据。我一开始以为是mysql缓存带来的影响,因此将mysql的缓存关闭,但是发现还是同样的问题。好吧接着我索性就把
stmt =mysql_stmt_init(conn);
mysql_stmt_free_result(stmt);
mysql_stmt_close(stmt);这三句代码移动到了循环内部,我每次生成新的查询对象,但是结果还是让我失望了。百思不得其解时我注释掉了所有能注释的语句,最终被我注释了 mysql_autocommit(conn, 0),然后一切都正常了,每次查询都是最新的表内容。
自动提交对select竟然也有影响!但是我又不能不禁用自动提交,如何解决这个问题呢。因为程序是从oracle换成mysql而改写的,提一下oracle,程序采用的是OCI库,其中OCIStmtExecute执行sql语句时通过第八个参数(oci的函数参数都是多的...)mode来决定立即提交还是等显示调用commit后提交,默认的是非自动提交,对于select语句参数同样设置的是default模式,的确select语句需要提交吗?在各种数据库的查询过程中,我们敲一行select语句之后并不需要commit,大多数数据库都是这样的。
但是mysql偏偏不是这样,难道真的要提交,于是我在mysql_stmt_prepare(stmt,sql,strlen(sql);之后添加了提交代码: mysql_commit(conn);问题顿时解决了,再循环查询中数据库的变动也能立即查询到了!
然后我打开mysql终端测试了下基本的查询,发现mysql cmd中存在同样的现象。大家可以根据我下面的步骤简单的测试下:打开终端A连上mysql,对于每个连接其默认的提交模式是自动提交,可输入命令show variables like 'autocommit';查看其默认是
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
输入命令set session autocommit = 0;将自动提交关闭,这时再查看参数为OFF,然后查询一张表;另开一个终端B对表数据进行修改并提交;返回终端A重复查询,可以发现其结果始终未变!然后默默的敲上commit;再次查询一次结果才是最新的表数据!也就是说我们查询一个表需要select....;commit;select....;这样的语句才能实时查询出结果!Mysql版本是5.5。
来看一下oracle,sqlplus连上数据库,输入show autocommit,显示默认为OFF(如果为ON,通过et autocommit off关闭),重复上面的测试,oracle虽然自动提交为OFF但是对于select并未有mysql的现象。
对于select读操作,oracle和mysql在自动提交设置关闭的情况下有着不同的处理,读操作是否需要提交,读虽然也算的上是一个事务,但是就像select....;commit;select....;这样才能查到正确数据的写法未免让人感觉别扭!先记住吧,以后有时间试下MYSQL C++ 类库或JDBC,看下是否有改变。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック

MySQLのインストール障害は、通常、依存関係の欠如によって引き起こされます。解決策:1。システムパッケージマネージャー(Linux APT、YUM、DNF、Windows VisualC Redistributableなど)を使用して、sudoaptinStalllibmysqlclient-devなどの欠落している依存関係ライブラリをインストールします。 2.エラー情報を慎重に確認し、複雑な依存関係を1つずつ解決します。 3.パッケージマネージャーのソースが正しく構成され、ネットワークにアクセスできることを確認します。 4. Windowsの場合は、必要なランタイムライブラリをダウンロードしてインストールします。公式文書を読んで検索エンジンを適切に使用する習慣を開発することは、問題を効果的に解決することができます。

700万のレコードを効率的に処理し、地理空間技術を使用したインタラクティブマップを作成します。この記事では、LaravelとMySQLを使用して700万を超えるレコードを効率的に処理し、それらをインタラクティブなマップの視覚化に変換する方法について説明します。最初の課題プロジェクトの要件:MySQLデータベースに700万のレコードを使用して貴重な洞察を抽出します。多くの人は最初に言語をプログラミングすることを検討しますが、データベース自体を無視します。ニーズを満たすことができますか?データ移行または構造調整は必要ですか? MySQLはこのような大きなデータ負荷に耐えることができますか?予備分析:キーフィルターとプロパティを特定する必要があります。分析後、ソリューションに関連している属性はわずかであることがわかりました。フィルターの実現可能性を確認し、検索を最適化するためにいくつかの制限を設定しました。都市に基づくマップ検索

DEVOPSエンジニアは、特に従来の方法がダウンタイムのリスクが発生しやすい高負荷状況で、RDSデータベースの最適化と更新の課題に直面することがよくあります。この記事では、RDSデータベースのゼロダウンタイムアップデートを実現するために、AWSブルー/グリーン展開戦略を紹介します。データベースの更新ダウンタイムの悪夢に別れを告げましょう!この記事では、ブルー/グリーンの展開戦略を詳細に説明し、AWS環境で運用手順を提供して、サービスの可用性に影響を与えることなくRDSデータベースインスタンスを更新するのに役立ちます。最初に準備して、開発チームを調整し、更新のために最も低いワークロードトラフィックの期間を選択します。優れたDevOpsは、チームに事前に通知するためのアドバイスを練習します。この例は、Blue/Green Deploymentを使用してダウンタイムがゼロでデータベースインスタンスストレージスペースを削減する方法を示しています。 AWSRDSコンソールを使用できます

MySQLパフォーマンスの最適化は、インストール構成、インデックス作成、クエリの最適化、監視、チューニングの3つの側面から開始する必要があります。 1。インストール後、INNODB_BUFFER_POOL_SIZEパラメーターやclose query_cache_sizeなど、サーバーの構成に従ってmy.cnfファイルを調整する必要があります。 2。過度のインデックスを回避するための適切なインデックスを作成し、説明コマンドを使用して実行計画を分析するなど、クエリステートメントを最適化します。 3. MySQL独自の監視ツール(ShowProcessList、ShowStatus)を使用して、データベースの健康を監視し、定期的にデータベースをバックアップして整理します。これらの手順を継続的に最適化することによってのみ、MySQLデータベースのパフォーマンスを改善できます。

この記事では、MySQLデータベースの操作を紹介します。まず、MySQLWorkBenchやコマンドラインクライアントなど、MySQLクライアントをインストールする必要があります。 1. mysql-uroot-pコマンドを使用してサーバーに接続し、ルートアカウントパスワードでログインします。 2。CreatedAtaBaseを使用してデータベースを作成し、データベースを選択します。 3. createTableを使用してテーブルを作成し、フィールドとデータ型を定義します。 4. INSERTINTOを使用してデータを挿入し、データをクエリし、更新することでデータを更新し、削除してデータを削除します。これらの手順を習得することによってのみ、一般的な問題に対処することを学び、データベースのパフォーマンスを最適化することでMySQLを効率的に使用できます。

MySQLのインストールエラーのソリューションは次のとおりです。1。システム環境を慎重に確認して、MySQL依存関係ライブラリの要件が満たされていることを確認します。異なるオペレーティングシステムとバージョンの要件は異なります。 2.エラーメッセージを慎重に読み取り、依存関係のインストールやSUDOコマンドの使用など、プロンプト(ライブラリファイルの欠落やアクセス許可など)に従って対応する測定値を取得します。 3.必要に応じて、ソースコードをインストールし、コンパイルログを慎重に確認してみてください。これには、一定量のLinuxの知識と経験が必要です。最終的に問題を解決する鍵は、システム環境とエラー情報を慎重に確認し、公式の文書を参照することです。

MySQLリモート接続:MySQLをインストールした後にリモート接続の問題に遭遇する多くの友人に熟練する(間違い)をあきらめることまで。この記事では、単純な「接続方法」を教えるのではなく、この一見単純な問題の背後に隠された落とし穴と、それらを優雅に解決する方法を詳細に調査し、最終的に「習熟」の状態に到達する方法を探ります(もちろん、習得は継続的な学習プロセスです)。目的:MySQLリモート接続の原則を徹底的に理解し、さまざまなシナリオでベストプラクティスをマスターして、一般的なトラップに陥らないようにします。この記事を読んだ後、さまざまなリモート接続の問題を独立して解決し、MySQLのセキュリティ構成をより深く理解することさえできます。概要:MySQL構成から始めます。

MySQLのインストール許可の問題は通常、次の理由によって引き起こされます。1。通常のユーザーは、rootまたはsudo許可を使用してインストールする必要があります。 2.ファイルの許可が不十分な場合、CHMODコマンドを使用してMySQLインストールディレクトリとデータファイルディレクトリの権限を変更する必要があります。 3. 3306ポートが占有されているため、NetStatコマンドを使用してポート占有サービスを表示および停止するか、MySQL構成ファイルを変更する必要があります。 4. SelinuxまたはApparmorセキュリティメカニズムの制限では、一時的に無効化または正しく構成しようとすることができます。安全で安定したシステム環境を構築するために、Sudoを使用して問題をバイパスするだけでなく、許可管理メカニズムを忘れないでください。
