tbl_jobs
アプリケーションで実行されているいくつかのバックグラウンド ジョブのメタ データを格納するという名前のテーブルがあります。スキーマは次のようになります。
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$$
type
ジョブが実行されるたびに、異なるジョブの一意の識別子であるrun time
とその実行の を含むエントリがテーブルに作成さrecords updated
れます。
タイプ と で同時に実行される 2 つの異なるジョブがありMAILER_UNLOCKED_REWARDS
ますMAILER_ALMOST_UNLOCKED
。
これらのジョブが同じタイムスタンプを持つエントリを挿入しようとすると、そのうちの 1 つだけが挿入され、もう 1 つのジョブはキーエラーの重複エントリをスローします。
たとえば、2 つのジョブは次のように実行されます。
INSERT INTO tbl_jobs
(type,
last_run_on,
records_updated)
VALUES ('MAILER_ALMOST_UNLOCKED',
'2012-08-22 19:10:00',
'f8a35230fb214989ac75bf11c085aa28:b591426df4f340ecbce5a63c2a5a0174')
それは正常に実行されましたが、2 番目のジョブが挿入コマンドを実行したときに
INSERT INTO tbl_jobs
(type,
last_run_on,
records_updated)
VALUES ('MAILER_UNLOCKED_REWARDS',
'2012-08-22 19:10:00',
'8a003e8934c07f040134c30959c40009:59bcc21b33a0466e8e5dc50443beb945')
エラーをスローしました
Duplicate entry 'M-2012-08-22 19:10:00' for key 'PRIMARY'
主キーはtype
とlast_run_on
列の組み合わせです。
timestamp
最初のジョブのエントリを削除すると、挿入は成功します。つまり、単独で一意であることを求めています。
ただし、同じものに対する競合は、timestamp
これら 2 つのジョブ間でのみ発生します。同じものに対して挿入される他のジョブがありますtimestamp
。
何が問題になる可能性があるかについてのアイデアはありますか?