探讨 MySQL 的锁

上篇博客说了 MVCC 解决了 MySQL 在可重复的隔离情况下幻读的问题,这篇博客主要探讨下,在修改的时候,如何解决幻读的问题。

MySQL 在控制并发的时候,同样采用了锁的机制。从读写上面分,有读写和写锁,从结构上分,有行锁和表锁.行锁又分为行锁、间隙锁和 Next Key

读锁和写锁

读锁 :共享锁 ,S 锁

写锁:排它锁 ,X 锁

select :不加锁,加锁后,也可以使用 select 查询数据

怎么加锁

select ...lock in share mode 加读锁

select ...for updare ,update、 delete 都是加写锁

其中,读读共享, 读写互斥 写写互斥

阅读更多

探讨 MySQL 事务隔离原理

数据库的事务一共有四个特性:

  1. 原子性:代表事务是一个动作,要么同时成功,要么同时失败
  2. 一致性:事务开始和结束数据完整性没有发生破坏
  3. 隔离性:两个事务动作相互独立,不受干扰
  4. 持久性:事务完成后,能够保存到数据库。

那 MySQL 是如何保证这个四个特性的呢?

为了弄明白这几个特性,我们需要先看下事务的隔离级别。

事务隔离级别

事务隔离级别分为 4 种,分别如下:

事务隔离级别 脏读 不可重复读 幻读
读未提交(read-uncommitted)
读已提交(read-committed)
可重复读(repeatable-read)
串行化(serializable)

上面的四种隔离级别,是通用的规则,在每一种不同的数据库中有不同的实现。

例如 MySQL 默认的事务隔离级别是 可重复读,但不会产生幻读的问题

为了能够演示事务的隔离的现象,需要做一些准备工作,我的环境是 MySQL 8.0+的版本,如果是其他版本可能命令会有点不同,其他基本一致。

阅读更多

202期比赛题目解法

5489. 两球之间的磁力

在代号为 C-137 的地球上,Rick 发现如果他将两个球放在他新发明的篮子里,它们之间会形成特殊形式的磁力。Rick 有 n 个空的篮子,第 i 个篮子的位置在 position[i] ,Morty 想把 m 个球放到这些篮子里,使得任意两球间 最小磁力 最大。

已知两个球如果分别位于 xy ,那么它们之间的磁力为 |x - y|

给你一个整数数组 position 和一个整数 m ,请你返回最大化的最小磁力。

示例 1:

img

1
2
3
输入:position = [1,2,3,4,7], m = 3
输出:3
解释:将 3 个球分别放入位于 1,4 和 7 的三个篮子,两球间的磁力分别为 [3, 3, 6]。最小磁力为 3 。我们没办法让最小磁力大于 3 。

示例 2:

1
2
3
输入:position = [5,4,3,2,1,1000000000], m = 2
输出:999999999
解释:我们使用位于 1 和 1000000000 的篮子时最小磁力最大。

提示:

阅读更多

201期比赛题目详解

5471. 和为目标值的最大数目不重叠非空子数组数目

给你一个数组 nums 和一个整数 target

请你返回 非空不重叠 子数组的最大数目,且每个子数组中数字和都为 target

示例 1:

1
2
3
输入:nums = [1,1,1,1,1], target = 2
输出:2
解释:总共有 2 个不重叠子数组(加粗数字表示) [1,1,1,1,1] ,它们的和为目标值 2 。

示例 2:

1
2
3
4
输入:nums = [-1,3,5,1,4,2,-9], target = 6
输出:2
解释:总共有 3 个子数组和为 6 。
([5,1], [4,2], [3,5,1,4,2,-9]) 但只有前 2 个是不重叠的。

示例 3:

1
2
输入:nums = [-2,6,6,3,5,4,1,2,8], target = 10
输出:3

示例 4:

阅读更多

博客升级

为什么又要折腾?

  1. 原来的博客用的是 Jekyll 搭建的,jekyll 是基于 ruby 开发的。现在的 ruby 维护太少了,我碰到的问题,一直没有很好的解决方案

  2. 老版本不支持 golang 语言的高亮,即使换了 highlightjs 的版本也不行,后续很多博客都无法更新

  3. 觊觎 next 主题有一段时间了,也想换成 netx 主题。

  4. 耗费了半天时间,踩了不少坑。还有很多优化,没有时间弄,后续再不上

以后博客这东西 还是少折腾。

阅读更多

字节码判断方法参数的个数

Jvm 如何确定方法的参数的个数

找到 Method 的 DescriptionIndex 的属性,找到对应的描述,例如:

1
2
3
4
5
6
7
8
9
10
11
public class AddMain {
public static void main(String[] args) {

int c = add(100,200);
System.out.println(c);
}

private static int add(int a, int b) {
return a + b;
}
}

这个例子中的 java 代码,add 方法对应的代码是 (II)I,最后一个 I 代表返回值,这个代表两个整型的参数.

1
2
3
private static int add(int a, int b,String c,boolean d) {
return a + b;
}

​ 同样,(IILjava/lang/String;Z)I 代表有4个参数,字符串的表示是:Ljava/lang/String;,解析比较特殊。

阅读更多

手写一个简单的JVM--01. 解析Class文件

java的运行过程

在运行一段 java 代码的时候需要经过编译,验证,加载运行,具体如下图:

运行过程

对于 Java 源码变成字节码的编译过程,我们暂且跳过不讨论。

想弄清楚 java 代码的运行原理,其实本质就是 java 字节码如何被 jvm 执行。

阅读更多

JVM指令的速记

在学习的JVM的时候,最重要的是认识JVM的指令,JVM指令很多,为了方便记忆,可以根据前缀和功能进行分类:

例如:nop指令代表是一个空指令,JVM收到指令后,什么都不用做,等待下一个指令。

阅读更多

设计模式---05.访问者模式

访问者模式

访问者模式是一种对象和对象的访问者分开的一种设计模式,在一个对象稳定的情况下,使用访问者模式可以更好的扩展对数据的访问。 相当于是我们在对象里面安插了一个“眼”,这个眼能够被外面实现,然后能拿到当前对象的各个属性。

阅读更多