十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
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中怎么生成全局唯一序列的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联行业资讯频道,感谢各位的阅读!