ITPub博客

首页 > 数据库 > MySQL > supremum pseudo-record锁影响

supremum pseudo-record锁影响

原创 MySQL 作者:G8bao7 时间:2014-01-14 14:45:11 0 删除 编辑
在开发中,经常会做这类的判断:根据主键值查询,如果不存在,则插入;否则更新。
例如
表结构

点击(此处)折叠或打开

  1. CREATE TABLE `t` (
  2.   `id` INT(11) NOT NULL AUTO_INCREMENT,
  3.   `val` BIGINT(20) NOT NULL,
  4.   PRIMARY KEY (`id`)
  5. ) ENGINE=INNODB DEFAULT CHARSET=utf8;

使用方式

点击(此处)折叠或打开

  1. START TRANSACTION;

  2. -- 方式一
  3. SELECT id FROM `t` WHERE `id` ='N' LOCK IN SHARE MODE;
  4. IF (FOUND_ROWS() <= 0) THEN
  5.     -- do insert
  6. end if;

  7. -- 方式二
  8. UPDATE `t` SET `val` = 'XX' WHERE `id` ='N';
  9. IF (ROW_COUNT() <= 0) THEN
  10.     -- do insert
  11. end if;

  12. commit;

当N超过表里的最大值时,两种方式都会对primary索引的 supremum pseudo-record加一个X锁,导致其他的insert会被阻塞
supremum pseudo-record :相当于比索引中所有值都大,但却不存在索引中,相当于最后一行之后的间隙锁
For the last interval, the next-key lock locks the gap above the largest value in the index and the supremumpseudo-record having a value higher than any value actually in the index. The supremum is not a real index record, so, in effect, this next-key lock locks only the gap following the largest index value.

建议改成原子操作, 不会阻塞其他insert

点击(此处)折叠或打开

  1. START TRANSACTION;
  2. insert into ... on duplicate key update `val`='XX';

  3. commit;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26250550/viewspace-1070422/,如需转载,请注明出处,否则将追究法律责任。

上一篇: linux alias使用
请登录后发表评论 登录
全部评论

注册时间:2013-11-04

  • 博文量
    486
  • 访问量
    1183375