2012-05-10 15 views
1

私はテーブルを頻繁に挿入し、更新して読み込みます(数ミリ秒間隔で)。 INSERT/UPDATEに続くSELECT文が古いデータを取得することがあることに気付きました。私はこれがキャッシュのためだと仮定しますが、それの前にSQL_NO_CACHEを置いた後は、実際に何もしません。MySQLのSQL_NO_CACHEが動作しない

SELECTは、前回のINSERT/UPDATEが終了してキャッシュからデータを取得しなくなるまで常に待機することを確認しますか?これらのステートメントは、別々の要求(同じコード実行内ではない)から実行されることに注意してください。

は、たぶん私は

UPDATE ... SQL_NO_CACHEが実際に何を誤解しています:

@Uday、INSERT、SELECTとUPDATEステートメントは次のようになります。

INSERT myTable (id, startTime) VALUES(1234, 123456)

UPDATE myTable SET startTime = 123456 WHERE id = 1234

SELECT SQL_NO_CACHE * FROM myTable ORDER BY startTime

私は運がない取引を使ってみました。

もっとUPDATE

私は、これは実際にINSERTに問題だと思う、更新しません。 SELECT文は常に最新の行を時間でソートしようとします。しかし、INSERTはテーブルレベルのロックを行わないため、SELECTが古いデータを取得する可能性があります。 INSERTを実行するときにテーブルレベルのロックを強制する方法はありますか?

+0

あなたはSELECTとUPDATEのサンプルを公開します。 – Uday

+1

[分離レベル](http://dev.mysql.com/doc/refman/5.5/en/set-transaction.html)はあなたですを使用して?これは、 'READ UNCOMMITTED'または' dirty reads 'を使用している場合に発生します。 –

+0

@MarcusAdams InnoDBのデフォルトの分離レベルが何であっても、それがあなたの質問に答えるかどうかはわかりません。 – pixelfreak

答えて

1

クエリキャッシュは問題ではありません。キャッシュを無効にします。

MySQLは書き込みを優先し、デフォルトの分離レベル(REPEATABLE READ)で、SELECTはUPDATEが完了するのを待たなければなりません。

CONCURRENT INSERTSがMyISAM用に有効になっている場合、INSERTは別の方法で扱うことができます。また、InnoDBはレコードロックを使用するため、テーブルの最後に挿入を待つ必要はありません。

これは競合状態ですか? UPDATE後にSELECTが起きていますか?おそらく更新がまだ伝播されていない複製されたサーバーから読んでいますか?

同時INSERTに問題がある場合は、MyISAMでCONCURRENT INSERTを無効にするか、INSERT中にLOCK TABLESで明示的にテーブルをロックします。ソリューションはInnoDBでも同じですが、LOCK TABLESを使用してINSERTでテーブルを明示的にロックしてください。

+0

@pixelfreak、私はちょうどINSERTに関する私の答えを更新しました。 MyISAMでその機能を無効にするか、LOCK TABLESで明示的にテーブルをロックする必要があります。 –

+0

Marcus、私はInnoDBを使用していますが、MyISAM – pixelfreak

+0

@pixelfreakではなく、InnoDBはレコードロックを使用しているため、SELECTはテーブルの最後に挿入されません。解決策は同じです。 LOCK TABLESを使用して、挿入時に明示的にテーブルをロックします。申し訳ありませんが、私も私の答えを更新していましたが、私はINSERTではなくあなたのUPDATEが問題だと言っていましたが。 :) –

0

A)
キャッシングがまったく必要ない場合(SELECTの場合)は、クエリ キャッシュを完全に無効にします。

B)
一つだけのセッションのためにこれをしたい場合、あなたは のようにそれを行うことができ、「設定セッションquery_cache_type = 0;」それは perticularセッションのためにこれを設定します。

いずれもSQL_NO_CAHCEを使用します。

+0

1) 'update'のようにもう1つの列を追加します。デフォルトは0です。2)アップデートitslefを削除しながら1にします。 SELECTでは、 "WHERE update = 1"条件を追加します。 – Uday

関連する問題