知识大全 利用mysql事务特性实现并发安全的自增ID示例

Posted

篇首语:搓绳不能松劲,前进不能停顿。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 利用mysql事务特性实现并发安全的自增ID示例相关的知识,希望对你有一定的参考价值。

利用mysql事务特性实现并发安全的自增ID示例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

项目中经常会用到自增id 比如uid 最简单的方法就是用直接用数据库提供的AUTO_INCREMENT 但是如果用户量非常大 几千万 几亿然后需要分表存储的时候呢 这种方案就搞不定了 所以最好有一个全局的自增ID的生成器 不管是否分表 都能从生成器中获取到全局自增的ID 实现方法应该有很多 不过所有的方案都需要解决一个问题 就是保证在高并发的情景下 数据获取依然正确 每次获取的ID都不会重复 这里我分享两种利用mysql的innodb的事务特性来实现的方案 一种是实现过了的 另一种没有试验过 不过应该也能走的通 先介绍第一种 在数据库中单独设置一张表 来存储ID 表有两个字段 一个是种类吧 一个就是ID

  复制代码 代码如下:

  CREATE TABLE auto_id( idname varchar( ) NOT NULL DEFAULT id bigint( ) NOT NULL DEFAULT MENT primary key(idname) )ENGINE=Innodb DEFAULT CHARSET=utf ;

接下来是一个存储过程

  复制代码 代码如下:

  delimiter // drop procedure if exists get_increment_id; create procedure get_increment_id(in idname_in varchar( ) in small_in bigint out id_out bigint) begin declare oldid bigint; start transaction; select id into oldid from maibo_auto_id where idname=idname_in for update; if oldid is NULL then insert into maibo_auto_id(idname id) value(idname_in small_in); set id_out=small_in; else update maibo_auto_id set id=id+ where idname=idname_in; set id_out=oldid+ ; end if; mit; end; //

重点是这句 select id into oldid from maibo_auto_id where idname=idname_in for update 会给相关数据加一个独占锁定 这时候别的进程如果来读取该条记录 就会进入等待 等待这个进程mit之后 再继续 这样就保证了在并发的情况下 不同的进程不会取到相同的值 如果你的前端是用php实现的 只需执行如下两个sql 就可以获取到 这个small参数是定义的是从多少开始自增

  复制代码 代码如下:

  $sql = call get_increment_id( $key $small @id) ; $ret = $db >getData( select @id );

还有另外一种方法 就是利用mysql的auto_increment 先创建一张表 表里边只有一个自增字段

  复制代码 代码如下:

  create table test( `id` int( ) NOT NULL AUTO_INCREMENT MENT id primary key (id) )ENGINE=MyISAM AUTO_INCREMENT= DEFAULT CHARSET=utf ;

通过如下两条sql

  复制代码 代码如下:

也能解决问题 LAST_INSERT_ID是不用查表的 而且只针对当前连接 也就是说别的连接的更新不会影响到当前连接的取值 这样可能每个ID都得弄一张表来维护 这也是缺点 具体使用中如何处理 就看自己的选择了 cha138/Article/program/MySQL/201405/30865

相关参考

知识大全 Oracle使用触发器实现自增ID

Oracle使用触发器实现自增ID  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  userinf

知识大全 oracle数据库如何创建自增列的技巧教程

  Oracle没有自增字段这样的功能但是通过触发器(trigger)和序列(sequence)可以实现  先建一个测试表了  createtableuserlogin(  id  

知识大全 JSP如何连接MYSQL数据库代码示例

JSP如何连接MYSQL数据库代码示例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!lishixi

知识大全 jsp连接MySQL实现插入insert操作功能示例

jsp连接MySQL实现插入insert操作功能示例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 用新的PHP插件实现MySQL为基础的事务

用新的PHP插件实现MySQL为基础的事务  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  事务处

知识大全 spring事物配置示例

  以前项目中经常用spring事务处理还没有亲自配置过惭愧现在马上上路.  首先在spring容器中配置transactionManager这个有好多实现这里以HibernateTransactio

知识大全 百万级高并发网站MYSQL应用攻略

百万级高并发网站MYSQL应用攻略  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在长时间的网站

知识大全 如何保证并发下资料库操作的原子性

如何保证并发下资料库操作的原子性不并发控制的话会带来一系列问题:资料冗余、更新异常、插入异常、删除异常等并发控制保证事务4个特性,acid:A:原子性(Atomicity)事务是资料库的逻辑工作单位,

知识大全 J2SE5.0新特性示例---泛型

J2SE5.0新特性示例---泛型  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  简介  泛型其

知识大全 利用窗体的自定义属性实现窗体传值

  第步在解决方案上添加一个窗体Form;并添加textBoxtextBoxButton将Button的标题设为确定DialogResult属性设为OK  第步在窗体Form的类代