在高争用期间插入/查询MySQL的意外行为

时间:2016-11-14 23:48:22

标签: mysql mysql-5.6

我遇到了一个意外情况,即在高争用期间插入/查询下表中的特定记录。我相信数据库中存在竞争条件。

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;

重现的步骤是:

  1. 使用此查询检查表中是否存在记录

    SELECT *
    FROM business_objects
    WHERE obj_type = 'Tip'
    AND obj_id = '7616904'
    
  2. 如果此查询为null,请尝试创建

    INSERT INTO business_objects (obj_type, obj_id)
    VALUES ('Tip', '7616904')
    
  3. 如果另一个线程已经创建了具有相同属性的记录,则此insert将失败并引发唯一性MySQL错误。在这种情况下,我捕获错误并在步骤1中运行相同的查询以获取记录。

    SELECT * 
    FROM business_objects
    WHERE obj_type = 'Tip'
    AND obj_id = '7616904'
    
  4. 查询返回空结果。

  5. 我的期望是,如果违反索引唯一性约束,则应将记录提交给表。我错过了什么?

0 个答案:

没有答案