2011-01-28 12 views
18

私は現在MySQLデータベースを実行しています。私のすべてのテーブルは、テーブルエンジンInnoDBを使用しています。MySQLの同時実行性、それはどのように動作し、アプリケーションでそれを処理する必要がありますか?

私のアプリケーションにログインすると誰でもレコードを見ることができますが、ある時点で2人のユーザーが同時にレコードを更新または挿入することがあると心配しています。 MySQLはこの種の並行処理の問題を正常に処理しますか、これは私のコードにプログラムしなければならないものですか?

これを自分のコードにプログラムする必要がある場合は、このような並行性のケースをどのように扱うのですか?

+0

これらについては気にする必要はありません。現代のデータベースは、並行性の制御で十分にスマートです:) – Tauquir

+0

thats私が考えたのは、私はダブルチェックをしたかったのです – medium

答えて

20

SQL文はアトミックです。

UPDATE Cars SET Sold = Sold + 1 

誰もがこの文の間にSold変数を変更することはできません:あなたはこのような何かを実行する場合それは、です。他の誰かが同じ文を同時に実行している場合でも、常に1だけインクリメントされます。これらのクエリの間

a = SELECT Sold FROM Cars; 
UPDATE Cars SET Sold = a + 1; 

、別のユーザーが販売テーブルの車と更新を変更することができます。

問題は、あなたがお互いに依存文を持っている場合に発生します。これを防ぐには、トランザクションでラップしてください。

BEGIN; 
a = SELECT Sold FROM Cars; 
UPDATE Cars SET Sold = a + 1; 
COMMIT; 

トランザクションは、InnoDBではサポートされますが、MyISAMではサポートされません。

+2

その説明に感謝します。 – medium

+2

取引であっても保証はありません。 MySQLはデフォルトでは、トランザクションであっても、書き込み操作の場合にのみ行レベルのロック/テーブルロックを行います。 ** a **に正しい値を設定するには、SELECTに* FOR UPDATE *を入れるか、またはTRANSACTIONで* SERIALIZABLE *としてより高い*分離レベル*を指定する必要があります。 **詳細情報:** [内部ロック](https://dev.mysql.com/doc/refman/5.6/en/internal-locking.html) [隔離レベル](https://dev.mysql .com/doc/refman/5.6/ja/innodb-transaction-isolation-levels.html)、 [ロックの読み取り](https://dev.mysql.com/doc/refman/5.6/en/innodb-locking- reads.html) –

関連する問題