2012-01-30 7 views
4

私はInnoDBデータベースでmysqlを使用しています。MYSQL - Locking - InnoDB

すべてのトランザクションが挿入と選択(更新なし)の場合は、SQLのデッドロックについて心配する必要はありません。

デッドロックが発生するシナリオはありません。インサートとセレクトのみを行うと、デッドロックが発生しないと見なすのは正しいですか?

は適切ではないかもしれませんが、すべてのトランザクションは、PDO

+1

異なるINSERTステートメントがあります:INSERT ... VALUES ...、INSERT ... SELECT ... '。両方を使用するのか、最初の変種のみを使用しますか? –

+0

「INSERT ... ON DUPLICATE KEY UPDATE」もあります。私はあなたがそれを持っていないと思います。 –

+0

これは特定のトランザクション分離レベルについての質問ですか?または一般的なもの(すべてについて)? –

答えて

1

あなたはまだSQLのデッドロックを心配する必要は番号で行われます。

デッドロックは、単一の行を挿入するトランザクションの場合でも発生します。これは、挿入操作が本当にアトミックではなく、挿入された行の(場合によっては複数の)索引レコードにロックが自動的に設定されるためです。

+0

'INSERT INTO ... VALUES'文だけを実行すると、デッドロックが発生する可能性がありますか?あなたは例を挙げることができますか? –

+0

この場合、デッドロックが発生するかどうかは実際には関係ありません。 INSERT VALUESを使用しているのかINSERT SELECTを使用しているのかにかかわらず、インサートはインデックスの一部をロックしている可能性があります。 –

+0

トランザクションによって行やテーブル、またはインデックスがロックされることがあります。しかし、トランザクションの種類によってロックのタイプが異なります。これはデッドロックの発生方法と関係があります。 –

0

InnoDB MySQLストレージエンジンには行レベルのロックがあり、MyISAM MySQLストレージエンジンにはテーブルレベルのロックがあります。 MyISAMは単にテーブル全体をロックし、トランザクションをサポートしないので、データベースレベルのデッドロックを持つことはできません。アプリケーションは、両方のアクセスしようとしているテーブルのテーブルロックに座って別のアプリケーションをロックすることができますが、これはコードレベルのエラーであり、dbレベルの「デッドロック」ではありません。

InnoDBはトランザクションをサポートしており、行レベルのロックを持っているため、dbレベルのデッドロックが発生する可能性があります(ビジー状態のシステムで時折発生する可能性があります。 MySQLが「デッドロック」と呼ぶものの多くは、遅いUPDATEが行ロックのタイムアウトを引き起こす原因と同じくらい「真のデッドロック」ではありません。