点击上方“Java基基”,选择“设为星标”

做积极的人,而不是积极废人!

每天 14:00 更新文章,每天掉亿点点头发...

源码精品专栏

  • 原创 | Java 2021 超神之路,很肝~

  • 中文详细注释的开源项目

  • RPC 框架 Dubbo 源码解析

  • 网络应用框架 Netty 源码解析

  • 消息中间件 RocketMQ 源码解析

  • 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析

  • 作业调度中间件 Elastic-Job 源码解析

  • 分布式事务中间件 TCC-Transaction 源码解析

  • Eureka 和 Hystrix 源码解析

  • Java 并发源码

来源:juejin.cn/post/
7035630158706901028

  • 前言

  • 理论知识

    • 什么是事务?

    • 脏读、不可重复读、幻读

    • mysql 的四种隔离级别

    • 两种悲观锁

  • Java 代码实现


前言

今天给大家带来也是比较实用的功能,用Java来生成序列号/订单号,列举几个在我们生活中比较常见的案例:

  • 订单号

  • 商品编号

  • 交易单号

  • 快递单号

数据存储 我是使用的 mysql ,下面就向大家分享一下是如何实现的~

推荐下自己做的 Spring Boot 的实战项目:

https://github.com/YunaiV/ruoyi-vue-pro

理论知识

什么是事务?

数据库事务 (简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。

脏读、不可重复读、幻读

1、脏读 :A 事务对数据修改但还没有提交到数据库,这个时候 B 事务来访问,那么 B 事务对数据就不是最新的,这种现象被成为脏读。

2、不可重复读 :A 事务多次读取一个数据,这个时候在中途 B 事务修改了数据,导致 A 事务多次读到的结果不一致。

3、幻读 :A 事务在前后两次查询同一个范围的时候、后一次查询看到了前一次查询未看到的行,因为 B 事务在后一次查询前新增加了一条数据。

mysql 的四种隔离级别

按照隔离的级别由低到高,越高的隔离,效率越差不可重复读 ,是 MySQL 的默认隔离级别

1、读未提交 :允许别的事务,去读取这个事务为提交之前的数据 缺点:可能会造成脏读、幻读、不可重复读。

2、不可重复读 :并发条件下会出现问题,比如:A 用户读取数据, 随后 B 用户读出该数据并修改, 此时 A 用户再读取数据时发现前后两次的值不一致 缺点:可能会造成幻读、不可重复读。

3、可重复读 :当使用可重复读隔离级别时,在事务执行期间会锁定该事务以任何方式引用的所有行。缺点:幻读

4、串行化 :不会使用 mysql 的 mvcc 机制,在每一个 select 请求下获得读锁,在每一个 update 操作下尝试获得写锁。缺点:效率最差

两种悲观锁

共享锁 (S 锁) : 如果事务 T 对数据 A 加上共享锁后,则其他事务只能对 A 再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。

排它锁 (X 锁) :如果事务 T 对数据 A 加上排他锁后,则其他事务不能再对 A 加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。

推荐下自己做的 Spring Cloud 的实战项目:

https://github.com/YunaiV/onemall

Java 代码实现

private  String createNewBidNumber() {//格式说明 CODE20201111xxx CODE+当前年月日+编号(具体长度看需求)String front="CODE";//前缀//当前时间编码Date date = new Date();String bidDate = new SimpleDateFormat("yyyyMMdd").format(date);Object bidService=null;//修改为自己的业务代码if (bidService != null){// 在数据表中查到了,说明现在这个订单不是今天的第一单String bid = bidService.getXXXX(); //取出ID,也就是业务号bid = bid.substring(10,13); // 取出后三位数,也就是自动生成的三位数 001int num = Integer.valueOf(bid);num ++;  // 加1if(num<10){String bidNum = String.format("%03d", num);//%03d 只是三位,不足补0String code = front+bidDate+bidNum;return code;}else if(num<100){String bidNum = String.format("%03d", num);//num<100,说明是两位数,前面要补一个0String code = front+bidDate+bidNum;return code;}else {String bidNum = String.valueOf(num);String code =front+bidDate+bidNum;return code;}}else {int number = 1;String bidNum = "00" + number;String code = front+bidDate+bidNum;return code;}}


欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

已在知识星球更新源码解析如下:

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 6W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)

Java如何生成序列号/订单号相关推荐

  1. Java 生成随机订单号

    Java 生成随机订单号 /** 根据时间生成随机订单号 */ public class GenerateNum { // 全局自增数 private static int count = 0; // ...

  2. java生成唯一订单号

    /*** 生成唯一订单号* 规则:四位随机数+"M"+格式化到秒的时间+"R"+六位随机数*/public static String getBillCode( ...

  3. SpringBoot 雪花算法生成商品订单号【SpringBoot系列13】

    SpringCloud 大型系列课程正在制作中,欢迎大家关注与提意见. 程序员每天的CV 与 板砖,也要知其所以然,本系列课程可以帮助初学者学习 SpringBooot 项目开发 与 SpringCl ...

  4. 生成唯一订单号 工具类

    package com.jsy.basic.util.utils;import java.text.SimpleDateFormat; import java.util.Date;/*** @prog ...

  5. 生成唯一订单号_人人皆知却暗藏玄机的“数据库唯一标识符”

    Hello 大家好,今天给大家讲一个几乎所有数据库都支持的特性:生成唯一标识符. 知乎视频​www.zhihu.com 详细内容: 唯一标识符应用场景非常多,比如网站注册时自动给新用户一个唯一 ID, ...

  6. MySQL高并发生成唯一订单号的方法

    高并发下生成唯一订单号的存储过程 这个是用mysql写的存储过程,搭配里面一张数据表使用,达到高并发情况下获得唯一订单号的目的:原理:按照一定规则生成订单号后,把订单号插入数据表后,再返回给用户,由于 ...

  7. 针对微信用户,随机生成商户订单号( OrderSN)

    /** * 针对微信支付生成商户订单号,为了避免微信商户订单号重复(下单单位支付), * * @return */ public static String generateOrderSN() {St ...

  8. php订单怎么生成,四种PHP生成唯一订单号的方法

    这几天一直在写个人使用的用户中心,虽然期间遇到不少的问题,但还是一点点的都解决了,也从制作期间学到不少的知识,今天就说一说利用PHP生成订单单的方法. 订单号,大家都不陌生,无论从在网上购物,还是在线 ...

  9. java获取不重复订单号,Java 生成永不重复的订单号

    package com.taiping.test; import java.text.SimpleDateFormat; import java.util.Date; import java.util ...

最新文章

  1. 领域驱动设计(DDD)架构演进和DDD的几种典型架构介绍(图文详解)
  2. 百度Create大会:百度AI安全研究的进展与愿景
  3. oracle 带有变量的语句_【成都校区】Oracle SQL语句之常见优化方法总结
  4. Java FutureTask示例程序
  5. arduino扩展板的使用_如何使用Arduino和React为烧烤构建仪表板
  6. Python中的TCP的客户端UDP学习----第一篇博客
  7. java中singleton_Singleton是什么,在Java中如何实现
  8. 图书管理系统(说明文档与相关代码)
  9. Repeater控件的嵌套使用
  10. android studio 4.0 去掉标题栏
  11. android无线投屏到电视盒子,【沙发管家】如何把电脑视频投屏到智能电视/ 电视盒子上?...
  12. 【经典源码】网络安全--远程控制--Gh0st3.6饭客网络sid版
  13. 阴阳师服务器维护6,《阴阳师》手游6月24日维护更新公告
  14. 快速部署k8s单机版
  15. 职业规划 思维导图
  16. oracle取同期和上期,取同期和上期数据
  17. 我们为什么要坚持写博客?
  18. 程序设计思维与实践 Week12 作业 必做题 A-zjm找数
  19. 迅时MX8(FXO)8口语音网关连接Elastix+服务器配置
  20. PCB走线和过孔通流能力的标准、影响因素及其计算软件

热门文章

  1. 打狗?看看wangxiaofeng(不许联想)的《人咬狗》
  2. 企业数字化成功转型的关键,从这三方面出发
  3. python的requests库的添加代理_python爬虫之requests库使用代理
  4. 抓住这几个关键点,做薪酬数据分析并不难
  5. 前端人生的最大危机不是 35 岁,是你工作3年的那道坎儿
  6. MyBatis类型处理器注册器TypeHandlerReister
  7. 【NestJS】内存Caching基本用法
  8. 带娃学Scratch之四狮子出场了
  9. C++脚本模拟重复点击(以摩尔庄园页游换慈善奖杯为例)
  10. PSR-0与PSR-4