ホームページ  >  記事  >  バックエンド開発  >  MySQL と GORM の同時書き込みによりエラーが発生する

MySQL と GORM の同時書き込みによりエラーが発生する

WBOY
WBOY転載
2024-02-09 10:30:18456ブラウズ

MySQL と GORM の同時書き込みによりエラーが発生する

MySQL と GORM の間の同時書き込みの問題は、開発者にとって常に頭の痛い問題です。同時実行性が高い状況では、複数のスレッドが同時にデータベースに書き込むと、データの不整合や誤った結果が生じる可能性があります。 PHP エディタ Baicao は、この問題の原因と解決策を分析し、同時書き込みによって引き起こされる問題を回避するのに役立ちます。合理的な設計と最適化により、MySQL と GORM の同時書き込みの問題を効果的に解決して、データの一貫性と正確性を確保できます。

質問内容

複雑なcsvインポートスクリプトをgolangで実装しました。 ワーカープール実装を使用します。このワーカー プールでは、ワーカーは製品を分類、ラベル付け、ブランド化する 1,000 個の小さな CSV ファイルを実行します。 これらはすべて同じデータベース テーブルに書き込みます。ここまでは順調ですね。

私が直面している問題は、3 つ以上のワーカーを選択すると、次のメッセージが表示されてプロセスがランダムにクラッシュすることです。

ワークフローは

リーリー

save() 呼び出しをトランザクションにラップしようとしましたが、役に立ちませんでした。

次のような質問があります:

    mysql は 1 つのテーブルに同時に保存するのに適していますか?
  1. このタスクを実行するためにトランザクションが必要な場合、どこに設定する必要がありますか?
  2. go SQL ドライバー (エラーは常に packet.go:1102 で発生します) はこれを行うのに適していますか?
  3. 誰か手伝ってくれませんか (数時間雇ってくれるかもしれません)。
完全に行き詰まってしまいました。役立つ場合はソースコードも共有します。しかし、まず、これが私のコードだと思うのか、それとも一般的な問題なのかを知りたいと思います。

回避策

各ゴルーチン (スレッドを使用する言語の場合はスレッド) で新しいデータベース接続を開きます。

MySQL のプロトコルはステートフルです。つまり、複数のゴルーチンが同じ接続を使用しようとすると、リクエストと応答が非常に混乱する可能性があります。

ゴルーチン間で他のタイプのステートフル プロトコル接続を共有しようとすると、同じ問題が発生します。

たとえば、ftp もステートフル プロトコルなので、こちらの方が理解しやすいかもしれません。クライアントのゴルーチンは「Get file x」のようなメッセージを送信する場合があり、その応答はファイルの内容を含む一連のメッセージである必要があります。リクエスト/レスポンスの進行中に別のゴルーチンが同じ接続を使用しようとすると、両方のクライアントが混乱します。 2 番目のゴルーチンは、要求していないファイルに属するパケットを読み取ります。ファイルをリクエストする最初のゴルーチンは、予期していたパケットの一部が読み取られていることがわかります。

同様に、MySQL のプロトコルは、単一の接続を共有する複数のクライアントのゴルーチンをサポートしていません。

以上がMySQL と GORM の同時書き込みによりエラーが発生するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。