「这是我参与11月更文挑战的第28天,活动详情查看:2021最后一次更文挑战」
前言
今天给大家带来也是比较实用的功能,用Java来生成序列号/订单号,列举几个在我们生活中比较常见的案例:
- 订单号
- 商品编号
- 交易单号
- 快递单号
数据存储我是使用的mysql,下面就向大家分享一下是如何实现的~
理论知识
什么是事务?
数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。
脏读、不可重复读、幻读
1、脏读:A事务对数据修改但还没有提交到数据库,这个时候B事务来访问,那么B事务对数据就不是最新的,这种现象被成为脏读。
2、不可重复读:A事务多次读取一个数据,这个时候在中途B事务修改了数据,导致A事务多次读到的结果不一致。
3、幻读:A事务在前后两次查询同一个范围的时候、后一次查询看到了前一次查询未看到的行,因为B事务在后一次查询前新增加了一条数据。
mysql的四种隔离级别
按照隔离的级别由低到高,越高的隔离,效率越差,不可重复读,是 MySQL 的默认隔离级别。
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(read-uncommitted) | 是 | 是 | 是 |
不可重复读(read-committed) | 否 | 是 | 是 |
可重复读(repeatable-read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
1、读未提交:允许别的事务,去读取这个事务为提交之前的数据
缺点:可能会造成脏读、幻读、不可重复读。
2、不可重复读:并发条件下会出现问题,比如:A用户读取数据,随后B用户读出该数据并修改,此时A用户再读取数据时发现前后两次的值不一致
缺点:可能会造成幻读、不可重复读。
3、可重复读:当使用可重复读隔离级别时,在事务执行期间会锁定该事务以任何方式引用的所有行。
缺点: 幻读
4、串行化:不会使用mysql的mvcc机制,在每一个select请求下获得读锁,在每一个update操作下尝试获得写锁。
缺点:效率最差
两种悲观锁
共享锁(S锁):如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。
排它锁(X锁):如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。
Java代码实现
1 | java复制代码private String createNewBidNumber() { |
致谢
- 数据库mysql之脏读、不可重复读、幻读
- 十分钟搞懂MySQL四种事务隔离级别
- 事物级别,不可重复读和幻读的区别
- 脏读、不可重复读 共享锁、悲观锁 和
事务五种隔离级别 - 关于MySQL可重复读的理解
- mysql-serializable-序列化隔离级别-串行化实例场景
本文转载自: 掘金