0%

1. 事务的 4 个基本要素

ACID 是数据库事务处理的 4 个基本要素.

  1. 原子性 Atomicity
    原子性是指数据库的事务是一个不可分割的工作单位, 只有数据库事务都成功才算成功,任何一个SQL的失败, 数据库状态都必须回退到事务开始前的状态

  2. 一致性 Consistency
    一致性是指事务将数据库的状态从一种状态转变为下一个一致的状态. 在事务的开始和结束后, 数据库的完整性约束都没有被破坏.

  3. 隔离性 Isolation
    隔离性是指事务之间对数据对象的读写是相互隔离的, 具体是提交后可见还是提交后也不可见取决于隔离等级, 前面两种情况分别为提交读(RC)和可重复读(RR).

  4. 持久性 Durability
    持久性是指事务一旦提交, 其修改是永久性的, 即使还未写入磁盘时发生宕机, 也能恢复数据.

一个支持事务的数据库, 必须具有这 4 个特性, 否则在事务过程中无法保证事务的正确性.

事务的隔离性是通过数据库锁的机制实现的, 持久性通过 Redo Log 来实现, 原子性和一致性通过 Undo Log 来实现.

Undo Log 的原理很简单, 为了满足事务的原子性, 在操作任何数据之前, 首先将数据备份到一个地方, 这个存储数据备份的地方称为 Undo Log, 然后进行数据的修改. 如果出现了错误或者用户执行了 Rollback 语句, 系统可以利用 Undo Log 中的备份将数据恢复到事务开始之前的状态.
和 Undo Log 相反, Redo Log 记录的是新数据的备份. 在事务提交前, 只要将 Redo Log 持久化即可, 不需要将数据持久化. 当系统崩溃时, 虽然数据没有持久化, 但是 Redo Log 已经持久化. 系统可以根据 Redo Log 的内容, 将所有数据恢复到最新的状态.

2. 事务的隔离级别

事务有以下 4 个隔离级别:

隔离级别 脏读 不可重复读 | 幻读
读未提交 Read Uncommitted Y Y
读已提交 Read committed N Y
可重复读 Repeatable N N
可串行化 Serializable N N

默认的事务隔离级别是 可重复读.
事务的隔离级别影响系统的并发处理能力, 级别越高, 越能保证事务的一致性, 对性能影响也越大.

之所以这样划分, 是因为并发事务会有以下 3 个问题:

  1. 脏读

即一个事务中还没有提交的数据, 被另外一个事务读到了.
如: 事务 A 开启事务从账户中取走 100 元; 但事务 A 还没提交前, 事务 B 来获取账户中余额, 发现并没有减少.

  1. 不可重复读

即在一个事务里面读取了两次某个数据, 读出来的数据不一致.
如: 事务 A 开启事务查询账户中余额为 1000 元; 同时事务 B 取走账户中 100 元, 并提交; 而事务 A 还没有结束, 又查询了一次账户余额, 发现账户中的余额为 900 元.

  1. 幻读

即在一个事务里面的操作中发现了未被操作的数据.
如: 事务 A 开启事务要更新一批数据; 同时事务 B 往数据库中插入一条记录, 并提交; 之后事务 A 提交事务时发现有一条记录没有更新到.

不可重复读和幻读的区别在于:
不可重复读是在一个事务中记录发生 变更, 需要通过行级锁解决;
幻读是在事务中表中数据发生了 新增删除, 同通过表级锁解决.

2.1. 事务隔离的实现方式

事务隔离的实现方式基本可分为 2 种:

  1. 在读取数据前, 对其加锁, 阻止其他事务对数据进行修改.

  2. 不用加任何锁, 通过一定机制生成一个数据请求时间点的一致性数据快照 (Snapshot), 并用这个快照来提供一定级别(语句级或事务级)的一致性读取. 从用户的角度来看, 好像是数据库可以提供同一数据的多个版本, 因此, 这种技术叫做数据多版本并发控制 (MultiVersion Concurrency Control, 简称MVCC), 也经常称为多版本数据库.

2.1.1. MVCC

Innodb MVCC主要是为 Repeatable-Read 事务隔离级别做的. 在此隔离级别下, A, B客户端所示的数据相互隔离, 互相更新不可见.

了解 Innodb 的行结构, Read-View 的结构对于理解 Innodb MVCC 的实现由重要意义.

Innodb 存储的最基本 row 中包含一些额外的存储信息 DATA_TRX_ID, DATA_ROLL_PTR, DB_ROW_ID, DELETE_BIT.
6 个字节的 DATA_TRX_ID 标记了最新更新这条行记录的事务 ID, 每处理一个事务, 其值自动 +1.
7 个字节的 DATA_ROLL_PTR 指向当前记录项的 rollback segment 的 undo log 记录, 找之前版本的数据就是通过这个指针.
6 个字节的 DB_ROW_ID, 当由 Innodb 自动产生聚集索引时, 聚集索引包括这个 DB_ROW_ID 的值, 否则聚集索引中不包括这个值.
DELETE BIT 位用于标识该记录是否被删除, 这里的不是真正的删除数据, 而是标志出来的删除.真正意义的删除是在commit的时候

3. 更新丢失问题

当两个或多个事务选择同一行, 然后基于最初选定的值更新该行时, 由于每个事务都不知道其他事务的存在, 就会发生丢失更新问题–最后的更新覆盖了由其他事务所做的更新.
对于这个问题, 需要开发人员在业务层控制, 规避这个问题的发生, 如使用全局锁等, 控制数据, 在同一时间只有一个人能访问同一数据资源.

https://blog.csdn.net/zx64881926/article/details/75150421

1. 代码段 Snippets

VSCode 文档

需要设置 "editor.tabCompletion": "on"

2. 常用插件

  • Sort lines

  • Selected Lines Count

  • Sublime Text Keymap and Settings Importer

  • Todo+

  • Local History

  • Markdown PDF

  • Markdown Preview Enhanced

  • PlantUML

  • SQL Formatter

  • Visual Studio Code Format

  • vscode-pdf

  • XML Tools

  • Selected Character Count

  • Paste Image

  • Git Graph

  • Paste URL

  • Language support for Java

3. Markdown Preview Enhanced 支持 hexo 语法

ctrl + shift + P 找到 Markdown Preview Enhanced: Extend Parser, 打开 parser.js
修改其中 onWillParseMarkdown 方法为

1
2
3
4
5
6
7
8
9
onWillParseMarkdown: function(markdown) {
return new Promise((resolve, reject)=> {
markdown = markdown.replace(
/{%s*asset_imgs*(.*)s*%}/g,
(whole, content) => (`![](${content})`)
)
return resolve(markdown)
})
}

4. Paste Url 插件插入格式改成 hexo的

修改 ~/.vscode/extensions/kukushi.pasteurl-0.4.4/out/src/extension.js

1
2
3
4
5
6
class MarkdownLinkFormatter {
formatLink(text, url) {
return '{% link ' + text + ' ' + url + '%}';
// return '[' + text + ']' + '(' + url + ')';
}
}

5. 自定义代码段字段提示完成

editor.tabCompletion: on

6. Resource

VSCode 文档

1. VSCode 安装 PlantUML

  1. 安装 Java 环境

  2. 安装 Graphviz

1
sudo apt install graphviz
  1. 安装 VSCode 插件 plantuml

支持文件格式 *.wsd, *.pu, *.puml, *.plantuml, *.iuml

快捷键:

Alt + D 预览 UML
Alt + Shift + F 格式化 plantuml 文件

  1. 配置修改

plantuml.exportOutDir: .
plantuml.exportSubFolder: false

2. 与 mermaid, yuml 比较

  • yuml 功能简单, 收费
  • mermaid 功能简单, 没有类图

3. 常见问题

3.1. 导出的图片中文乱码

通过命令行执行

1
java -DPLANTUML_LIMIT_SIZE=8192 -jar plantuml.jar -charset UTF-8 E:\doc\index.puml

vscode 配置中修改, 但是貌似没起作用

1
2
3
4
{
"plantuml.commandArgs": ["-Dfile.encoding=UTF-8"],
"plantuml.jarArgs": ["-charset", "UTF-8"]
}

4. Resource

1. 3 大范式

  1. 第一范式
    每一列都是不可分割的原子数据项
  2. 第二范式
    要求实体的属性完全依赖于主关键字.
    所谓完全依赖是指不能存在仅依赖主关键字一部分的属性
    第二范式就是在第一范式的基础上属性完全依赖于主键
  3. 第三范式 任何非主属性不依赖于其它非主属性

管理员与程序员也有相似的地方. 程序员管理对象, 指挥他们相互通信, 完成系统功能; 管理员管理手下, 指挥他们相互合作, 完成公司目标. 不同的是手下思想和能力可能不是管理员能决定的, 他们可能有自己不同意见, 解决问题的能力也有强有弱, 面向对象设计的思想是站在对象的角度思考问题, 所以同样管理手下也需要以人为本的思想. 公司的目标也是需要管理员自己发现, 挖掘. 怎样做, 怎么做, 成本如何都是需要考虑的.

less 与 more 类似, 但使用 less 可以随意浏览文件, 而 more 仅能向前移动, 却不能向后移动, 而且 less 在查看之前不会加载整个文件.

1. 命令参数:

-b <缓冲区大小> 设置缓冲区的大小
-e 当文件显示结束后, 自动离开
-f 强迫打开特殊文件, 例如外围设备代号, 目录和二进制文件
-g 只标志最后搜索的关键词
-i 忽略搜索时的大小写
-m 显示类似more命令的百分比
-N 显示每行的行号
-o <文件名> 将less 输出的内容在指定文件中保存起来
-Q 不使用警告音
-s 显示连续空行为一行
-S 行过长时间将超出部分舍弃
-x <数字> 将 tab 键显示为规定的数字空格

/字符串 向下搜索 字符串 的功能
?字符串 向上搜索 字符串 的功能

n 重复前一个搜索(与 / 或 ? 有关)
N 反向重复前一个搜索(与 / 或 ? 有关)
b 向后翻一页
d 向后翻半页
h 显示帮助界面
Q 退出less 命令
u 向前滚动半页
y 向前滚动一行
空格键 滚动一行
回车键 滚动一页
[pagedown] 向下翻动一页
[pageup] 向上翻动一页

1
2
3
# rsz: 进程占用的物理内存
# vsz: 进程占用的虚拟内存
ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid'

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# PID: 进程的ID
# USER: 进程所有者
# PR: 进程的优先级别, 越小越优先被执行
# NInice: 值
# VIRT: 进程占用的虚拟内存
# RES: 进程占用的物理内存
# SHR: 进程使用的共享内存
# S: 进程的状态.
S表示休眠, R表示正在运行, Z表示僵死状态, N表示该进程优先值为负数
# %CPU: 进程占用CPU的使用率
# %MEM: 进程使用的物理内存和总内存的百分比
# TIME+: 该进程启动后占用的总的CPU时间, 即占用CPU使用时间的累加值.

# COMMAND: 进程启动命令名称
top -p [pid]

1.

2. 如何更新源

brew install 时会先执行 brew update, 即先更新下自己
该操作比较慢, 可通过修改代码源优化加速.

Homebrew 由 3 个部分组成:

  • brew
  • homebrew-core
  • homebrew-cask
  • homebrew-bottles 二进制预编译包

更新源
https://mirrors.tuna.tsinghua.edu.cn/help/homebrew/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27


# brew
cd "$(brew --repo)"
git remote set-url origin https://mirrors.ustc.edu.cn/brew.git
# git remote set-url origin https://mirrors.aliyun.com/homebrew/brew.git
# git remote set-url origin https://github.com/Homebrew/brew.git

# homebrew-core
cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git
# git remote set-url origin https://mirrors.aliyun.com/homebrew/homebrew-core.git
# git remote set-url origin https://github.com/Homebrew/homebrew-core.git

# homebrew-cask
cd "$(brew --repo)/Library/Taps/homebrew/homebrew-cask"
git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-cask.git
# git remote set-url origin https://github.com/Homebrew/homebrew-cask.git

# homebrew-bottles
echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles' >> ~/.zshrc_osx
# echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.aliyun.com/homebrew/homebrew-bottles' >> ~/.zshrc_sox
source ~/.zshrc


brew update
# 如果命令执行成功, 则表示更新源成功

3. 手动安装

如果下载安装文件比较慢, 可以手动安装

1
2
3
4
# 进入 Homebrew 缓存目录
cd "$(brew --cache)"
# 替换掉已下载的安装包即可
# 已下载的安装包会放在 `./download` 目录下, 然后软连接到此目录下

4. 常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 诊断Homebrew的问题
brew doctor

# 更新包
# 也可以使用 reinstall
brew upgrade [software]

# 获取最新的包的列表
brew outdated

# 清理旧版本和缓存文件
brew cleanup [software]
# 查看可清理的旧版本包, 不执行实际操作
brew cleanup -n

# 查看指定的软件包的相关信息; 如果没有指定, 显示安装了包数量, 文件数量, 和总占用空间
brew info [software]

# 查看已安装的包的依赖, 树形显示
brew deps --installed --tree

5. 常用安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
brew install autojump
brew install axel
brew install bash
brew install make grep gnu-sed gnu-tar gnu-time gnu-which gnu-indent gnu-units inetutils findutils ed coreutils
brew install rar

brew cask install iterm2
brew cask install visual-studio-code
brew cask install sogouinput
brew cask install spectacle
brew cask install alfred
brew cask install docker
brew cask install flux
brew cask install google-chrome
brew cask install intellij-idea
brew cask install wechat

brew cask install atom
brew cask install cheatsheet
brew cask install dingtalk
brew cask install edrawmax
brew cask install foxmail
brew cask install tunnelblick

# brew cask install jietu
# brew cask install snip # 截图工具
brew cask install snipaste # 截图工具
brew cask install yed # 画图工具


# redis-cli
brew tap ringohub/redis-cli
brew update && brew doctor
brew install redis-cli