我遇到了一个意外情况,即在高争用期间插入/查询下表中的特定记录。我相信数据库中存在竞争条件。
CREATE TABLE `business_objects` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`obj_id` varchar(255) DEFAULT NULL,
`obj_type` varchar(255) DEFAULT NULL,
`created_at` datetime(6) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `index_business_objects_on_obj_type_and_obj_id`
(`obj_type`,`obj_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
重现的步骤是:
使用此查询检查表中是否存在记录
SELECT *
FROM business_objects
WHERE obj_type = 'Tip'
AND obj_id = '7616904'
如果此查询为null,请尝试创建
INSERT INTO business_objects (obj_type, obj_id)
VALUES ('Tip', '7616904')
如果另一个线程已经创建了具有相同属性的记录,则此insert
将失败并引发唯一性MySQL错误。在这种情况下,我捕获错误并在步骤1中运行相同的查询以获取记录。
SELECT *
FROM business_objects
WHERE obj_type = 'Tip'
AND obj_id = '7616904'
查询返回空结果。
我的期望是,如果违反索引唯一性约束,则应将记录提交给表。我错过了什么?