MySql中int类型的简单总结
问题
首先问两个问题:
- int(1)和int(10)有什么区别。
- int(3)可以存储 10000 这个数字吗?
- int(11)可以用来存储手机号么?
本次的源代码以及测试的 Mysql 版本均为 8.0.17
首先问两个问题:
本次的源代码以及测试的 Mysql 版本均为 8.0.17
在一个完整的项目里面,肯定是有各种各样的入参校验的,如果业务上的一些逻辑校验,可以放在 Service 层面进行,但是如果是 Controller 里面的校验,直接可以用 validation 进行验证。配合注解可以很方便的实现各种各样的入参校验。
如下:
1 | public class User { |
然后在Controller里面
1 |
|
在Java语言里面,Semaphore 的作用是可以控制对于同一个临界资源,允许多少个线程同时执行。
当线程执行到临界区域的时候,需要先向 Semaphore 申请一个令牌,此时 Semaphore 会判断现有的的令牌是不是小于0,如果小于0,则阻塞当前线程,直至有线程将令牌归还回来。
如果一个线程直接申请到了permits,则是直接通过CAS操作将 state 减一即可,然后线程继续执行。
当无法申请到 Semaphore 的 permits 的时候,则会将当前的线程进行阻塞,直到有线程执行完毕,释放了 permit。
在大量使用Java8中的流式操作之后,觉得用起来还挺舒服的,所以正好趁这个机会总结下。
使用Java8的lambda表达式的时候,需要先把集合转为一种流,也就是调用 stream 方法,但是 stream 却是 Collection 类里面的一个方法,也就是只有 Collection 的子类才可以使用,所以 Map 集合是使用不了的,同理,对于数组,可以通过Arrays.stream()
方法来讲数组转为一个Stream,这样也可以使用Stream里面的方法了,
下面介绍几个很常用的方法来介绍流式操作的便捷性。
1 | List<String> stringList = new ArrayList<>(); |
在JDK1.7向JDK1.8升级的过程中,ConcurrentHashMap
由原来的可重入锁和CAS
锁直接被替换为synchronized
关键字了,虽然说在功能上都是完全一致的,但是在这里一直都有一个疑惑,既然在1.7的使用过程中没什么问题,那到底是出于什么原因要将其替换呢。
在JDK1.7中,其结构是由一个可重入锁Segment
数组和每一个节点下的HashEntry
数组来实现的。结构图如下:
由于 segment 是一个锁,所以如果在并发的过程中,多个线程尝试向一个 segment 中的 HashEntry 进行插入的时候,只能有一个线程会获取到锁,其他的线程会被阻塞直至锁被释放,所以这个容器是一个并发安全的。
在Leetcode上有一道题目,如下:
In a deck of cards, each card has an integer written on it.
Return true if and only if you can choose X >= 2 such that it is possible to split the entire deck into 1 or more groups of cards, where:
Each group has exactly X cards.
All the cards in each group have the same integer.
这一题就是一个求最大公约数的题目,当任意两组的公约数为1的时候,那么此时就说明,他们的分组数量不相等就可以直接返回false了。
1 | public boolean hasGroupsSizeX(int[] deck) { |
在InnoDB里面,是通过快照读来实现RC
和PR
隔离级别的区分,因为在RC
隔离级别下,每一次的select都是一个快照读,所以是可以读取到已经提交的数据,从而导致幻读。所以在RC
隔离级别下,快照读和当前读都是可以出现幻读。
但是在PR
的隔离级别下,由于快照读仅仅只生成一次,所以在PR
级别下的快照读是无法出现幻读的,但是当前读确实可以出现幻读。
查看Mysql官方对于幻读
的定义。
The so-called phantom problem occurs within a transaction when the same query produces different sets of rows at different times.
幻读表示的是在一个事物里面 同一个select
语句,前后两次查询出来的结果是不相同的,需要注意的一点是,在InnoDB里面,幻读跟事物的隔离级别有关,更加准确的说是跟一个事物的快照和当前读有关
下面是在Mysql8.0.11版本下进行幻读的复现:
在临近上线之前,我们系统做了一次压力测试,发现有一个接口在高并发情况下会出现一个死锁的情况。。首先申明…不是我写的,我只是帮忙排查下。
随着对Mysql锁的深入了解,于是就准备写几篇文章来记录下Mysql各种事物和索引的情况下出现死锁的情况。
今天就介绍下在并发插入的情况下,哪几种情况会出现死锁:
在介绍锁的时候只会介绍跟本节相关的锁,而且只会讲述大概是什么,至于锁的更加详细的讲解可能会到以后再详细介绍。
随着项目的收尾,使用Vue
也有大概两个月时间了,在这期间也才遇到过了不少的问题,今天就来说下 Vue
中URL不同但是页面相同的解决办法。
假设有两个URL,都对应的是一个相同的 Vue 页面,URL分别是 view/account/1
和 edit/account/1
,此时如果由 view/account/1
跳转至 edit/account/1
,你会发现页面是不会刷新的, 从而直接影响了整体的功能。
于是去网上寻找解决方案,在一个 github 的 issue 里面,看到也有人反映过这个问题,不过作者的回复是采用
reload
方式进行强制刷新,也就是类似于 F5 那样,页面首先会白一下,然后就再出现元素。这样虽然可以实现页面上元素的一些加载,但是同时它的弊端也体现出来了,就是对用户极度的不友好,所以最后我们才用了一种Reload的方式来进行刷新的。