专栏首页only theone 的记录mysql 是如何保证在高并发的情况下autoincrement关键字修饰的列不会出现重复

mysql 是如何保证在高并发的情况下autoincrement关键字修饰的列不会出现重复

转载自 https://juejin.im/book/5bffcbc9f265da614b11b731/section/5c42cf94e51d45524861122d#heading-8 mysql实现这个机制的背后,主要有两种方式

  1. 采用 AUTO-INC 锁,也就是在执行插入语句时,就在表级别上加一个AUTO-INC锁。然后,为每条待插入记录的AUTO_INCREMENT修饰的列分配递增的值。在该语句执行完成之后,再把AUTO-INC锁释放掉。需要注意的是,在释放锁的时候,不同于一般情况下的读锁和写锁,是在事务执行完成之后自动释放锁。AUTO-INC锁是在当前语句插入完成之后释放的。
  2. 采用一个轻量级的锁,在为插入语句生成AUTO_INCREMENT修饰的列分配递增的值时获取该锁,在数值分配完成后就释放该锁。所以采用这种方式的话,必须清楚该插入语句具体的插入数量。同时,这种方式避免锁表,所以,效率较高。

我们可以执行

SHOW VARIABLES LIKE '%innodb_autoinc_lock_mode%';

这条sql语句,查看我们本地的mysql数据库服务器是采用的那种方式 若值为0,AUTO-INC锁方式; 若值为1,轻量级锁方式; 若值为2,两种方式混着来(就是插入记录数量确定的情况下使用轻量级锁,不确定时采用AUTO-INC锁方式)。

tips: 采用轻量级锁时,可能会造成不同事务中,插入语句生成的数值是交叉的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Springboot 系列(九)使用 Spring JDBC 和 Druid 数据源监控

    作为一名 Java 开发者,相信对 JDBC(Java Data Base Connectivity)是不会陌生的,JDBC作为 Java 基础内容,它提供了一...

    未读代码
  • MYSQL 8 vs MYSQL 5.7 ORACLE 到底怎么想的? (二)

    1 在MYSQL 5.7 临时表包含了一个 "converting HEAP to on disk", 意思当临时表达到最大的内存使用的限制(一个表一个)16M...

    AustinDatabases
  • Springboot 系列(十一)使用 Mybatis 访问数据库

    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数获取结果集的过...

    未读代码
  • 解密 Redis 助力双 11 背后电商秒杀系统

    原文链接:http://t.cn/EAlQqQD

    业余草
  • MySQL字段null和not null学习思考

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

  • MongoDB系列---用户及权限管理02

    2.1.2 查看admin中的用户 我们可以通过 db.system.users.find()函数来查看 admin 库中的所有用户信息...

    Arebirth
  • centos 手动安装mysql8

    官网太慢了,在清华镜像站下载:https://mirrors.tuna.tsinghua.edu.cn/mysql/downloads/MySQL-8.0/

    pollyduan
  • 面试题: 分布式事务

    随着微服务架构的普及,一个大型业务系统往往由若干个子系统构成,这些子系统又拥有各自独立的数据库。往往一个业务流程需要由多个子系统共同完成,而且这些操作可能需要在...

    框架师
  • Ubuntu18 的超详细常用软件安装

    心血来潮,在笔记本安装了Ubuntu 18 用于日常学习,于是有了下面的安装记录。

    未读代码
  • B站:5. docker 启动 mongodb

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    suveng

扫码关注云+社区

领取腾讯云代金券