2017-10-30 1 views
0

1つのトランザクションにクエリを挿入するか、またはクエリを更新します。私はそのトランザクションの下でコミットしませんし、挿入されたデータは他のトランザクションによってアクセスします。なぜこれが起こっているのですか? 例:1つのトランザクション内のコミットされていないデータは、他のトランザクションによってアクセスされます。なぜですか?

私は2つの異なるセッションで2つのトランザクションの下にしようとします: セッション1:

START TRANSACTION; 

INSERT INTO test (id) VALUES (1); 

セッション2:

START TRANSACTION; 

select * from test where id=1 

これが実行され、私のIDが1のデータを提供します。

ここで、最初のトランザクションで挿入クエリをコミットせずに、次に挿入されたクエリのデータに2番目のトランザクションでアクセスする方法を教えてください。

私はstackoverflowの上のリンクのほとんどを読んで、彼らはあなたが同じトランザクション内で行った

すべてが同じトランザクション内後でコマンドに表示されていることを述べています。 コミットするまで他の取引にはしません。これは、コミットされていない読み取りを除くすべての分離レベルに当てはまります。

私のInnoDBコンフィグ設定が似ています:

innodb_commit_concurrency 0

innodb_flush_log_at_trx_commit 1

tx_isolation REPEATABLE-READ

ON

自動コミットは、この設定は、トランザクション中のデータに影響を与えている。

+1

の最後の行を確認するには

ALTER TABLE foo ENGINE=InnoDB; 

であなたのテーブルを変換することができます。設定は 'autocommit ON'ですので、何らかのDMLが発生するたびに自動的にコミットされます。 – XING

+0

confファイルで設定を変更し、自動コミットをOFFに設定しても問題はありませんか? – mansi

+0

それは理想的な状態でなければなりません。 – XING

答えて

0

おそらくエンジンタイプMyISAMのテーブルを使用します。これらはトランザクションをサポートしていません。代わりにエンジンタイプInnoDBを使用してください。あなたは、単に、エンジンが使用され、チェックあなた自身があなたのクエリに答え

SHOW CREATE TABLE foo\G 
関連する問題