2010-11-30 15 views
1

私は.. FOR UPDATE MySQLのSELECTの問題を抱えています、ここで私が実行しようとしていますクエリです。この後MYSQL SELECT ... FOR UPDATE動作していませんか?

SQL = "SELECT * " + 
     "FROM " + TableName + " " + 
     "WHERE out_status IN ("+outSStatus+") AND queued <= NOW() " + 
     "ORDER BY out_status, id_queue ASC "+ limitSql+ 
     "FOR UPDATE"; 

は、その後である99にout_statusをUPDATEを行うと、変更されたスレッド、行をロック解除する必要があります。

私はマルチスレッドのJavaアプリケーションを実行しているので、3つのスレッドがこのSQL文を実行していますが、スレッド1がこれを実行すると、スレッド2の結果をロックしません(隠す)。& 3.スレッド2 & 3は同じ結果を得ています。

また、各スレッドは独自のmysql接続にあります。

誰でもこの手伝いできますか?または、おそらくより良い解決策がありますか?

非常に感謝しています。

答えて

1

あなたはそれが動作するかもしれない、とあなたは気づくことができないtransactions

1

を使用することができます。スレッド1が文を実行し、auto-commitがオンであったため、トランザクションを自動的にコミットしたとします。もちろん、もちろんスレッド2でもそれを実行できます。

this methodConnectionクラスを使用してauto-commitをオフに設定して、結果を確認してください。

+0

私はauto-commit = off ...と設定しましたが、上記ではまだトランザクションを使用する必要がありますか?例:BEGINとCOMMIT – James

+0

@James:そうだが、少なくとも動作し始めた。あなたはVikashの答えを受け入れることができます。 –

2

私も同様の問題がありました。 @Vikashと@Adeel Ansariの両方の回答が有効な提案です。しかし、MyISAMの代わりにInnoDBエンジンを使用して問題を解決しました。 MyISAMは、行レベルではなくテーブルレベルでのロックのみを許可します。 InnoDBを使用している場合、依然として取引が必要です。

関連する問題