2017-04-06 8 views
0

申し訳ありませんが、これは愚かな質問です。 私は70以上のテーブルとトランザクションを使用するMySQL InnoDBアプリケーションを持っています。 すべてが一つのことを除いて正常に動作している(表):私は、すべてのクエリに対して同じ原理を使用していInnoDB取引の原則

CREATE TABLE IF NOT EXISTS `mag_pj_art_sums` (
`id` int(11) NOT NULL, (primary key) 
`id_pj` int(11) NOT NULL, (index) 
`id_artikal` int(11) NOT NULL, (index) 
`kol_stanje_knjig` decimal(18,2) DEFAULT NULL) 

:PRIMARYキーはSELECTとUPDATEのために使用されているすべてのテーブルの

START TRANSACTION (query('set autocommit=0;'); query('START TRANSACTION;');) 
SELECT … FROM table WHERE … 
UPDATE TABLE SET …. WHERE …. 
COMIT 

(以下でクエリスキーマ)。私が使用mag_pj_art_sums除き

SELECT … FROM mag_pj_art_sums WHERE (id_artikal='$id_artikal' AND id_pj='$id_pj') 

UPDATE mag_pj_art_sums SET … WHERE (id_artikal='$id_artikal' AND id_pj='$id_pj') 

それは、これらの行は、このシナリオでロックされていないことは可能ですか?

この表では、SELECT - UPDATEクエリが同時に発生すると、一貫性のない値が返されるためです。クエリはエラーなく実行されますが、値は必要に応じて更新されません。

答えて

2

いいえ、ロックされていません。トランザクション分離レベルを変更していない場合でも、デフォルト値はREPEATABLE-READです。
これは、ファントム読み取りが可能であることを意味します。私はthis answerに簡単な説明を書きました。あなたは何をすべき

START TRANSACTION; 
SELECT … FROM table WHERE … FOR UPDATE; 
UPDATE TABLE SET …. WHERE …; 
COMMIT; 

SELECT ... FOR UPDATEhereについてお読みです。

+0

私の疑いが確認されました。ありがとうございました – MiTja

1

INDEX(id_artikal), INDEX(id_pj)は、ではなく、であり、INDEX(id_artikal, id_pj)と同じである。後者を追加してください。両方のクエリがより高速に実行されます。

はい、FOR UPDATEです。です。このは、のすべてにを追加する必要があります。の場合は、START; SELECT...; UPDATE (same row)...; COMMITです。気づいていないエラーが発生している可能性があります。

私はtx_isolationについて心配しません。

+0

そして私のmysqlの生活のこの新しいレベル:-)あなたの素晴らしいテキストをhttp://mysql.rjweb.org/doc.php/index_cookbook_mysqlで読んでいただきありがとうございます – MiTja

+0

あなたは歓迎して、素敵な言葉に感謝します。あなたはそこに有益な情報を見つけるだけではありません。そのブログを読んでいる人が多くなればなるほど、このフォーラムでは「シンプルな」質問が少なくなるでしょう。 –