MySQL の自動インクリメント ID はすべて初期値を定義し、その後ステップ サイズを継続的に増加します。自然数には上限がありませんが、数値を表現するのに使用されるバイト長は定義されているため、コンピュータのストレージには上限があります。たとえば、 unsigned int は 4 バイトで、その上限は テーブル定義の自動増分 ID自動増分値が上限に達した後のテーブル定義のロジックは、次の ID を適用するときに、取得された値は変更されないままになります。 mysql> テーブル t を作成します (id int unsigned auto_increment 主キー) auto_increment=4294967295; クエリは正常、影響を受けた行は 0 行 (0.01 秒) mysql> t 値に挿入します(null); クエリは正常、1 行が影響を受けました (0.00 秒) mysql> show テーブル t を作成します。 +-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | テーブル | テーブルの作成 | +-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | t | テーブル `t` を作成する ( `id` int unsigned NOT NULL AUTO_INCREMENT, 主キー (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4294967295 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci | +-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ セット内の 1 行 (0.00 秒) //4294967295 行を正常に挿入しました mysql> t 値に挿入します(null); エラー 1062 (23000): キー 't.PRIMARY' のエントリ '4294967295' が重複しています 最初の挿入が成功した後、テーブルのAUTO_INCREMENT は4294967295 のままであるため、2 番目の挿入で同じ自動増分 ID 値が取得され、挿入ステートメントの実行が試行され、主キーの競合が発生します。 InnoDBシステムはrow_idを自動的に増加させる主キーを指定せずに InnoDB テーブルを作成すると、InnoDB は自動的に非表示の 6 バイトのrow_idを作成します。 InnoDBはグローバル 主キーのないすべての InnoDB テーブルでは、データ行が挿入されるたびに、現在の コードが実装されると、 row_id は長さが 8 バイトの符号なし long 整数 (bigint unsigned) になります。しかし、InnoDB が設計された当時、 row_idの長さは 6 バイトしかなかったため、データ テーブルに書き込まれる際には最後の 6 バイトのみが配置されていました。そのため、データ テーブルに書き込むことができるrow_idの値には、次の 2 つの特徴があります。
つまり、テーブルに書き込まれる row_id の範囲は この結論を検証します。gdb を通じてシステムの自動インクリメントrow_id を変更します。 GDB は問題の再現を容易にするために使用され、テスト環境でのみ使用できます。 row_idが検証シーケンスで使い果たされました
使用後の効果の検証 gdb を使用して dict_sys.row_id を 2^48 に設定すると、この値の row_id が 0 であるため、テーブル t の最初の行に a=2 が挿入されることがわかります。 したがって、InnoDB テーブルに自動インクリメント主キーを積極的に作成する必要があります。テーブルの自動インクリメント ID が上限に達すると、データを挿入するときに主キーの競合エラーが報告されます。 シドREDO ログと binlog には、トランザクションに対応するために使用される共通フィールド Xid があります。 MySQL 内で Xid はどのように生成されますか? MySQLは内部的にグローバル変数 ステートメントが実行されるたびに、それが 現在のステートメントがトランザクションによって実行される最初のステートメントである場合、MySQL はトランザクションの Xid に
ただし、MySQL を再起動すると、新しい binlog ファイルが再生成され、同じ binlog ファイル内の Xid が一意であることが保証されます。 MySQL を再起動しても同じ binlog に 2 つの同一の Xid が表示されることはありませんが、
Innodb の trx_id Xidはサーバー層によって管理される しかし、InnoDB 独自の trx_id は、別途管理されるトランザクション ID です。 InnoDB は内部的に max_trx_id グローバル変数を維持します。新しい trx_id が必要になるたびに、max_trx_id の現在の値が取得され、max_trx_id が 1 ずつ増加します。 InnoDBデータ可視性の核となる考え方各データ行には、それを更新する trx_id が記録されます。トランザクションがデータ行を読み取ると、トランザクションの一貫性のあるビューとデータ行の trx_id を比較して、データが表示可能かどうかを判断します。 実行中のトランザクションについては、information_schema.innodb_trx テーブルからトランザクションの trx_id を確認できます。 次の例を参照してください: トランザクションのtrx_id
S2の実行記録: mysql> information_schema を使用します。 テーブル名と列名の補完のためのテーブル情報の読み取り -Aでこの機能をオフにすると起動が速くなります。 データベースが変更されました mysql> innodb_trx から trx_id、trx_mysql_thread_id を選択します。 +-----------------+---------------------+ | trx_id | trx_mysql_thread_id | +-----------------+---------------------+ | 421972504382792 | 70 | +-----------------+---------------------+ セット内の 1 行 (0.00 秒) mysql> innodb_trx から trx_id、trx_mysql_thread_id を選択します。 +---------+---------------------+ | trx_id | trx_mysql_thread_id | +---------+---------------------+ | 1355623 | 70 | +---------+---------------------+ セット内の1行(0.01秒) S2 は、innodb_trx テーブルからこれら 2 つのフィールドを取得します。2 番目のフィールド t2 に表示される trx_id は非常に大きな数値ですが、t4 に表示される trx_id は 1289 で、比較的正常な数値のように見えます。これはなぜでしょうか?
明らかな変更ステートメントに加えて、select ステートメントの後に for update が追加された場合、それは読み取り専用トランザクションではありません。
t2 で見つかった大きな数字はどこから来たのでしょうか? これにより、次のことが保証されます。
なぜ248を追加するのですか? 読み取り専用トランザクションに表示される trx_id 値が比較的大きいことを確認して、通常の状況下で読み取り/書き込みトランザクションの ID と区別できるようにします。ただし、trx_id のロジックは row_id と似ており、8 バイトとして定義されます。 読み取り専用トランザクションに trx_id が割り当てられないのはなぜですか?
読み取り専用トランザクションでは trx_id が割り当てられないため、trx_id の増加率は明らかに低下します。 この状態に達すると、MySQL ではダーティ リード バグが発生し続けます。 ダーティリードを再現する システムの max_trx_id は 2^48 - 1 に設定されているため、セッション A で開始されたトランザクション TA の最低水準点は 2^48 - 1 になります。 t2時:
t3時: セッション A は選択可視性判断を実行します。データ バージョン c=3 の trx_id (0) はトランザクション TA の最低水準点 (2^48 - 1) より小さいため、データは可視であると見なされます。 しかし、これは汚い読み方です。 また、MySQL を再起動しても これにより、低水準点とデータの可視性についての理解も深まります。 スレッドIDシステムはグローバル変数 新しい接続が作成されるたびに、 ただし、 新しいスレッドに 要約する各自動インクリメント ID には独自のアプリケーション シナリオがあり、上限に達した後の動作が異なります。
オンラインのMySQL自動増分IDが枯渇した場合の対処法については以上です。MySQL自動増分ID枯渇に関する詳細は、123WORDPRESS.COMの過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。今後とも123WORDPRESS.COMをよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: Web コンポーネントの内部イベント コールバックと問題点の分析
>>: テーブルはセルとimg画像を結合してtd HTML全体を埋めます
複数行のテキストがオーバーフローすると省略記号が表示されますこの記事では 2 つの方法を推奨します。...
1. 概要Zabbix は非常に強力で、最も広く使用されているオープンソースの監視ソフトウェアです。...
まず、nginx コンテナ内の構造:コンテナを入力します: docker exec -it b511...
分割線はウェブページでよく使われるデザインです。例えば、Zhihuのその他の回答をご覧ください。 こ...
1. Alibaba Cloudは、個人のニーズに応じて適切なクラウドサーバーを選択し、CPU、メ...
serializableシリアル化(問題なし)トランザクションは順次実行する必要があります。前のトラ...
この記事では、WeChatアプレットのレコード機能を実装するための具体的なコードを参考までに紹介しま...
<marquee> タグはペアで表示されるタグです。最初のタグ <marquee...
序文以前、rem適応についての記事を書きましたが、具体的なパッケージは紹介しませんでした。今日は、よ...
目次序文クイックレビュー: JavaScript 関数関数とは何ですか?関数を宣言する関数の呼び出し...
HTML における相対と絶対の違い: 正直に言うと、HTML は世界で最もシンプルな言語です。タグ言...
準備Windows Server 2008 R2 Enterprise (2.40GH、8GB、64...
目次1 配列のフラット化とは何ですか? 2 JS標準ライブラリの配列フラット化メソッド3 フラットメ...
httpリターンコードリスト(以下は概要です)詳細な中国語の説明についてはここをクリックしてくださ...
<br /> この記事は allwebdesignresources.com から Ra...