网站建设资讯

NEWS

网站建设资讯

mysql中怎么生成全局唯一序列

MySQL中怎么生成全局唯一序列,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

创新互联公司:成立于2013年为各行业开拓出企业自己的“网站建设”服务,为1000多家公司企业提供了专业的成都网站设计、成都网站建设、网页设计和网站推广服务, 按需定制由设计师亲自精心设计,设计的效果完全按照客户的要求,并适当的提出合理的建议,拥有的视觉效果,策划师分析客户的同行竞争对手,根据客户的实际情况给出合理的网站构架,制作客户同行业具有领先地位的。

  • 业务场景:订单系统中生成订单号,按照每天从1开始生成

  • 大致思路是:将生成序列的步骤放到mysql的函数中实现,java中负责调用mysql函数获取序列,代码中调用时需要保证同一时间只有一次调用,所以代码中首先会将获取序列服务类定义成单利的服务对象,方法中采用同步关键字。使用jetty测试工具,在并发一万情况下调用改序列生成的函数无问题,无重号。

  • 参考代码

  • Mysql脚本


DROP TABLE IF EXISTS tbl_sequence; CREATE TABLE tbl_sequence ( name varchar(40) CHARACTER SET utf8 NOT NULL COMMENT '序列名称', current_value int(15) NOT NULL COMMENT '当前值' ) ENGINE=InnoDB DEFAULT CHARSET=latin1; INSERT INTO tbl_sequence VALUES ('test', '38');

set global log_bin_trust_function_creators=1;

DELIMITER $$
DROP FUNCTION IF EXISTS currval$$
CREATE FUNCTION currval(seq_name VARCHAR(50)) RETURNS varchar(40) BEGIN DECLARE valuep VARCHAR(40); if 0=(SELECT count(name) FROM tbl_sequence WHERE NAME=seq_name) then INSERT INTO tbl_sequence (name, current_value) VALUES (seq_name, '1'); end if; SELECT current_value INTO valuep FROM tbl_sequence WHERE NAME = seq_name; UPDATE tbl_sequence SET current_value = current_value + 1 WHERE NAME = seq_name; RETURN valuep; END $$
DELIMITER;


  • Java代码


a) Sping中service使用采用单例模式 @Service("serialNumberUtil") @Scope("singleton") public class SerialNumberUtil {

b) 获取方法中采用同步关键字 public synchronized String getOrderNumber(String pix,String dataStr) { return sequenceDao.getOrderNumber(pix,dataStr); }

看完上述内容,你们掌握mysql中怎么生成全局唯一序列的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联行业资讯频道,感谢各位的阅读!


分享名称:mysql中怎么生成全局唯一序列
本文地址:http://cdweb.net/article/geiphp.html