私はtbl_jobs
というテーブルを持っています。このテーブルには、アプリケーションで実行中のバックグラウンドジョブのメタデータが格納されています。スキーマは次のようである:mysqlのキー 'PRIMARY'の重複エントリ
CREATE TABLE `tbl_jobs` (
`type` varchar(30) NOT NULL DEFAULT '',
`last_run_on` datetime NOT NULL,
`records_updated` text,
PRIMARY KEY (`type`,`last_run_on`),
UNIQUE KEY `index2` (`type`,`last_run_on`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1$$
仕事は、それは異なるジョブの一意の識別子、その実行中run time
とrecords updated
あるtype
とテーブルにエントリを作成し実行しますたび。 MAILER_UNLOCKED_REWARDS
とMAILER_ALMOST_UNLOCKED
:
はタイプで同時に実行二つの異なるジョブがあります。
これらのジョブが同じタイムスタンプでエントリを挿入しようとすると、そのうちの1つだけが挿入され、もう1つは重複エントリエラーをスローします。例えば
は、2つのジョブには、以下を実行しました:正常に実行されたが、2番目のジョブがINSERTコマンドINSERT INTO tbl_jobs
(type,
last_run_on,
records_updated)
VALUES ('MAILER_UNLOCKED_REWARDS',
'2012-08-22 19:10:00',
'8a003e8934c07f040134c30959c40009:59bcc21b33a0466e8e5dc50443beb945')
を実行したときにそれがエラーを投げた
INSERT INTO tbl_jobs
(type,
last_run_on,
records_updated)
VALUES ('MAILER_ALMOST_UNLOCKED',
'2012-08-22 19:10:00',
'f8a35230fb214989ac75bf11c085aa28:b591426df4f340ecbce5a63c2a5a0174')
Duplicate entry 'M-2012-08-22 19:10:00' for key 'PRIMARY'
主キーはtype
との組み合わせです10列。
最初のジョブのエントリを削除すると、挿入が成功します。つまり、timestamp
だけが一意であることを要求しています。
しかし、同じtimestamp
の競合は、これらの2つのジョブ間でのみ発生します。同じtimestamp
のために挿入される他のジョブがあります。
問題が発生する可能性のあるアイデアはありますか?
あなたは 'show create table tbl_jobs'を表示できますか – jcho360
コメントだけですが、私はサロゲートキーの使用をお勧めします。毎秒複数のエントリが発生している可能性があります。 – Kermit
主キーは必然的に一意であるため、スクリプトのUNIQUE KEY行を削除する必要があります。 – sp00m