事务隔离级别
本文简单介绍一下数据库的事务隔离级别,所用数据库采用 MySQL
,MySQL
提供了两种事务性的存储引擎 InnoDB
和 NDB Cluster
,本文示例采用 InnoDB
存储引擎。
查看当前数据的事务隔离级别
1 | -- 查看当前数据库事务隔离级别 |
不同的事务隔离级别所面对的问题
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(read-uncommitted) | 是 | 是 | 是 |
读已提交(read-committed) | 否 | 是 | 是 |
可重复读(repeatable-read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
脏读
:事务 A 读取了事务 B 更新的数据,然后 B 回滚操作,那么 A 读取到的数据是脏数据。不可重复读
:事务 A 多次读取同一数据,事务 B 在事务 A 多次读取的过程中,对数据作了更新并提交,导致事务 A 多次读取同一数据时,结果不一致。幻读
:系统管理员 A 将数据库中所有学生的成绩从具体分数改为 ABCDE 等级,但是系统管理员 B 就在这个时候插入了一条具体分数的记录,当系统管理员 A 改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。
脏读的场景
客户端 A 先开启事务,查询用户余额
1 | -- 客户端A设置当前会话级别为`read-uncommitted` |
JVM 手册
记录常用的 JVM 参数,持续更新 …
堆内存设置
-Xms128M
: 设置 java 程序启动时堆内存 128M(默认为物理内存 1/64,且小于 1G),阿里 p3c 文档中推荐 Xmx 与 Xms 配置同样的大小,避免 GC 后调整堆大小带来的压力
-Xmx256M
: 设置最大堆内存 256M,超出后会出现 OutOfMemoryError(默认为物理内存 1/64,且小于 1G)
-Xmn10M
: 设置新生代区域大小为 10M
-XX:NewSize=2M
: 设置新生代初始大小为 2M
-XX:MaxNewSize=2M
: 设置新生代最大值为 2M
-Xss1M
: 设置线程栈的大小 1M(默认 1M)
-XX:MinHeapFreeRatio=40
: 设置堆空间最小空闲比例(默认 40)(当 Xmx 与 Xms 相等时,该配置无效)
-XX:MaxHeapFreeRatio=70
: 设置堆空间最大空闲比例(默认 70)(当 Xmx 与 Xms 相等时,该配置无效)
curl-command 手册
Spring Cloud Alibaba Introduction
介绍
Spring Cloud Alibaba
致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用服务的必需组件(涵盖了服务治理、配置管理、限流降级以及阿里开源生态和商业生态的诸多组件),方便开发者通过Spring Cloud
编程模型轻松使用这些组件来开发分布式应用服务。依托Spring Cloud Alibaba
,您只需要添加一些注解和少量配置,就可以将Spring Cloud
应用接入阿里分布式应用解决方案,通过阿里中间件来迅速搭建分布式应用系统。
Spring Cloud 是什么
Spring Cloud provides tools for developers to quickly build some of the common patterns in distributed systems .
Spring Cloud
为开发者提供了快速构建分布式系统的模型。Spring Cloud
除了抽象了分布式系统里的一些接口,并且提供了一系列开箱即用的组件。
Spring Cloud
更详细的介绍以及相关的组件,可以参考官网。
Spring Cloud Alibaba 对 Spring Cloud 的意义
Spring Cloud Alibaba
在Spring Cloud
体系中是一个套件,类似于Netflix OSS
,为开发者提供了更多的选择。- 在
Netflix OSS
诸多重要组件先后宣布停止新功能开发的大背景下Spring Cloud Alibaba
作为一个高速迭代中的新生项目无疑是更合适的选择。 - 将国内非常流行的
Dubbo
、RocketMQ
等融入Spring Cloud
体系,使得应用的接入和改造的成本更低。 Spring Cloud Alibaba
是中文文档最全的Spring Cloud
组件。
组件
开源组件
夏令时问题
在工作中,遇到一个很有意思的关于时间的问题,这里跟大家分享一下。
现象
从数据库里取出用户的生日1990-05-22
,接口返回时发现返回值变成了1990-05-21
,而对于1992-05-22
这样的日期却能正确返回。
网上很多对于相关问题的分析都是简单粗暴的认为是时区的问题,却没有讲明白问题出现的根本原因。
排查过程
问题复现
为了复现问题现象,我们先快速搭建一个 Spring Boot Application。
先将配置文件中对日期类型的格式化配置为 yyyy-MM-dd
,如下所示:
1 | spring.jackson.time-zone=GMT+8 |
写一个接口,直接将有问题的日期输出,代码如下:
PowerShell 手册
记录一些常见的 Powershell
的使用问题
别名命令
在使用 Linux 系统时,我喜欢使用 ll
命令来查看当前目录的文件,但是 Windows 系统的 Powershell 没有这个命令,所以每次用的时候就很不习惯。我们可以通过对命令设置别名来让 Powershell 支持我们的使用习惯。
查看别名
Get-Alias
或者 gal
命令来查看我们系统命令的别名,如下
1 | PS C:\Users\fuyongde> get-alias |
- 查看某别名的原命令,如
ls
的原命令:Get-Alias ls
- 查看某原命令的别名,如
Get-ChildItem
的别名:Get-Alias -Definition Get-ChildItem
临时创建或更改别名
使用 Set-Alias
命令来创建或更改别名,但是改命令只在当前的的 PowerShell Session 中生效。另外还有一个 New-Alias
命令用法类似。
创建不带参数的别名
Linux 手册
记录一些常用的 Linux 操作,持续更新 …
查看系统版本
常用的查看系统版本有以下命令
cat /etc/os-release
uname -a
cat /proc/version
cat /etc/issue
下面演示一下 cat /etc/os-release
,其他不详细说明。
1 | cat /etc/os-release |
输出如下
1 | PRETTY_NAME="Debian GNU/Linux 9 (stretch)" |
替换源
由于网络的原因,国内部分 Linux 在安装软件时非常缓慢,将源替换为国内的镜像可以方便很多。
RPC 进阶 - 线程池
在 Rpc Introduction 中简单写了一个 RPC Framework
。在本节中,对 Edith
新增采用线程池支持多线程的特性。
背景
实际开发中,我们的应用程序是不能盲目的开辟线程的,这样会造成资源的极大浪费。若采用线程池,可以减少创建和销毁线程的次数,让每个线程可以多次使用,并且可以根据系统的承受能力,调整线程池中工作线程的数量,方式消耗过多的内存。
如有需要可以阅读 Dubbo
中关于线程池的设计(位于 org.apache.dubbo.common.threadpool
包)。
开发
依赖
1 | <dependency> |
Code
本文代码可以从这里获取。
新增 ThreadUtils.java
RPC Introduction
What is RPC
Remote Procedure Call (RPC) is a protocol that one program can use to request a service from a program located in another computer on a network without having to understand the network’s details. A procedure call is also sometimes known as a function call or a subroutine call. A procedure call is also sometimes known as a function call or a subroutine call.
RPC
是一种远程过程调用协议,一个程序可以使用该协议从位于网络上另一台计算机中的程序请求服务,而无需了解网络的详细信息。RPC
有时也称为函数调用或子程序调用。RPC
是进程间通信的一种方式。
Why is RPC
网上很多关于 RPC
的优点,笔者都不太赞同。不能将那些成熟的 RPC
框架解决的问题全部归结为 RPC
的优点。比如 RPC
的概念中并没有提到服务治理等问题,但是常见的 RPC
框架(如 DUBBO)均解决了服务治理的相关问题,这显然不能作为 RPC
的优点。要解释“Why is RPC?”的问题,还是要回归到 RPC
的概念上来。
RPC
可以使远程过程调用变得像本地调用一样简单。- 方便计算能力的横向扩展。
有兴趣可以阅读 dubbo 诞生的背景 以及dubbo 解决了哪些需求。
RPC vs HTTP
其实这两者不是同一个维度的概念。从 RPC
的概念上来讲,HTTP
其实就是 RPC
的一种实现。