mirror of https://github.com/dunwu/db-tutorial.git
update docs
parent
aba34051fa
commit
2b23fe83dc
|
@ -56,7 +56,7 @@
|
||||||
*.ico binary
|
*.ico binary
|
||||||
*.gif binary
|
*.gif binary
|
||||||
|
|
||||||
# media
|
# medias
|
||||||
*.mp3 binary
|
*.mp3 binary
|
||||||
*.swf binary
|
*.swf binary
|
||||||
|
|
||||||
|
|
|
@ -1,16 +1,37 @@
|
||||||
################ JAVA ################
|
# ---------------------------------------------------------------------
|
||||||
# temp folders
|
# more gitignore templates see https://github.com/github/gitignore
|
||||||
|
# ---------------------------------------------------------------------
|
||||||
|
|
||||||
|
# ------------------------------- java -------------------------------
|
||||||
|
# compiled folders
|
||||||
classes
|
classes
|
||||||
target
|
target
|
||||||
logs
|
logs
|
||||||
|
.mtj.tmp/
|
||||||
|
|
||||||
# temp files
|
# compiled files
|
||||||
*.class
|
*.class
|
||||||
|
|
||||||
|
# bluej files
|
||||||
|
*.ctxt
|
||||||
|
|
||||||
|
# package files #
|
||||||
*.jar
|
*.jar
|
||||||
*.war
|
*.war
|
||||||
|
*.nar
|
||||||
|
*.ear
|
||||||
|
*.zip
|
||||||
|
*.tar.gz
|
||||||
|
*.rar
|
||||||
|
|
||||||
|
# virtual machine crash logs
|
||||||
|
hs_err_pid*
|
||||||
|
|
||||||
|
# maven plugin temp files
|
||||||
|
.flattened-pom.xml
|
||||||
|
|
||||||
|
|
||||||
################ JAVASCRIPT ################
|
# ------------------------------- javascript -------------------------------
|
||||||
# dependencies
|
# dependencies
|
||||||
node_modules
|
node_modules
|
||||||
|
|
||||||
|
@ -28,11 +49,11 @@ yarn-error.log*
|
||||||
bundle*.js
|
bundle*.js
|
||||||
|
|
||||||
|
|
||||||
################ IDEA ################
|
# ------------------------------- intellij -------------------------------
|
||||||
.idea
|
.idea
|
||||||
*.iml
|
*.iml
|
||||||
|
|
||||||
|
|
||||||
################ Eclipse ################
|
# ------------------------------- eclipse -------------------------------
|
||||||
.classpath
|
.classpath
|
||||||
.project
|
.project
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<div align="center"><img width="100px" src="http://dunwu.test.upcdn.net/cs/others/zp.png!zp"/></div>
|
<div align="center"><img width="100px" src="http://dunwu.test.upcdn.net/common/logo/zp.png"/></div>
|
||||||
|
|
||||||
# DB Tutorial
|
# DB Tutorial
|
||||||
|
|
||||||
|
|
376
docs/index.html
376
docs/index.html
|
@ -1,214 +1,214 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8"/>
|
<meta charset="UTF-8"/>
|
||||||
<title>db-tutorial</title>
|
<title>db-tutorial</title>
|
||||||
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible"/>
|
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible"/>
|
||||||
<meta content="DB Tutorial" name="description"/>
|
<meta content="DB Tutorial" name="description"/>
|
||||||
<meta
|
<meta
|
||||||
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"
|
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"
|
||||||
name="viewport"
|
name="viewport"
|
||||||
/>
|
/>
|
||||||
<link href="http://dunwu.test.upcdn.net/images/others/zp_50_50.png" rel="icon" type="image/x-icon"/>
|
<link href="http://dunwu.test.upcdn.net/common/logo/zp_50_50.png" rel="icon" type="image/x-icon"/>
|
||||||
<link href="//unpkg.com/docsify/lib/themes/vue.css" rel="stylesheet" title="vue"/>
|
<link href="//unpkg.com/docsify/lib/themes/vue.css" rel="stylesheet" title="vue"/>
|
||||||
<style>
|
<style>
|
||||||
h1 + ul {
|
h1 + ul {
|
||||||
display: block !important;
|
display: block !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.content img,
|
.content img,
|
||||||
.sidebar img {
|
.sidebar img {
|
||||||
border: none;
|
border: none;
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
box-shadow: 0 0 8px grey;
|
box-shadow: 0 0 8px grey;
|
||||||
}
|
}
|
||||||
|
|
||||||
.content,
|
.content,
|
||||||
.sidebar,
|
.sidebar,
|
||||||
.sidebar-toggle,
|
.sidebar-toggle,
|
||||||
body,
|
body,
|
||||||
.search input {
|
.search input {
|
||||||
color: #6B615F !important;
|
color: #6B615F !important;
|
||||||
background-color: #FFF4E6 !important;
|
background-color: #FFF4E6 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.content strong,
|
.content strong,
|
||||||
.sidebar strong,
|
.sidebar strong,
|
||||||
body strong {
|
body strong {
|
||||||
color: #5C5869 !important;
|
color: #5C5869 !important;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<style>
|
<style>
|
||||||
.cover-main .anchor span {
|
.cover-main .anchor span {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
background-image: -webkit-linear-gradient(left, #FFDCB4, #B96972 25%, #E88A57 50%, #804170 75%, #A596CD);
|
background-image: -webkit-linear-gradient(left, #FFDCB4, #B96972 25%, #E88A57 50%, #804170 75%, #A596CD);
|
||||||
-webkit-text-fill-color: transparent;
|
-webkit-text-fill-color: transparent;
|
||||||
-webkit-background-clip: text;
|
-webkit-background-clip: text;
|
||||||
-webkit-background-size: 200% 100%;
|
-webkit-background-size: 200% 100%;
|
||||||
-webkit-animation: masked-animation 1.5s infinite linear;
|
-webkit-animation: masked-animation 1.5s infinite linear;
|
||||||
font-family: "Brush Script MT", 隶书, serif;
|
font-family: "Brush Script MT", 隶书, serif;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
}
|
}
|
||||||
|
|
||||||
.cover-main blockquote p {
|
.cover-main blockquote p {
|
||||||
color: #5C5869;
|
color: #5C5869;
|
||||||
font-family: "Arial", 隶书, serif;
|
font-family: "Arial", 隶书, serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
.cover-main ul a:hover {
|
.cover-main ul a:hover {
|
||||||
color: #FE4165 !important;
|
color: #FE4165 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.cover-main p a:hover {
|
.cover-main p a:hover {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
background-image: -webkit-linear-gradient(left, #FFDCB4, #B96972 25%, #E88A57 50%, #804170 75%, #A596CD);
|
background-image: -webkit-linear-gradient(left, #FFDCB4, #B96972 25%, #E88A57 50%, #804170 75%, #A596CD);
|
||||||
-webkit-text-fill-color: transparent;
|
-webkit-text-fill-color: transparent;
|
||||||
-webkit-background-clip: text;
|
-webkit-background-clip: text;
|
||||||
-webkit-background-size: 200% 100%;
|
-webkit-background-size: 200% 100%;
|
||||||
-webkit-animation: masked-animation 1.5s infinite linear;
|
-webkit-animation: masked-animation 1.5s infinite linear;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* content 样式内容 */
|
/* content 样式内容 */
|
||||||
.sidebar a,
|
.sidebar a,
|
||||||
.content a {
|
.content a {
|
||||||
color: #399AB2 !important;
|
color: #399AB2 !important;
|
||||||
text-decoration: none !important;
|
text-decoration: none !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sidebar a:hover,
|
.sidebar a:hover,
|
||||||
.content a:hover {
|
.content a:hover {
|
||||||
color: #FE4165 !important;
|
color: #FE4165 !important;
|
||||||
text-decoration: underline !important;
|
text-decoration: underline !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.content h1 :hover,
|
.content h1 :hover,
|
||||||
.content h2 :hover,
|
.content h2 :hover,
|
||||||
.content h3 :hover,
|
.content h3 :hover,
|
||||||
.content h4 :hover {
|
.content h4 :hover {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
background-image: -webkit-linear-gradient(left, #FFDCB4, #B96972 25%, #E88A57 50%, #804170 75%, #A596CD);
|
background-image: -webkit-linear-gradient(left, #FFDCB4, #B96972 25%, #E88A57 50%, #804170 75%, #A596CD);
|
||||||
-webkit-text-fill-color: transparent;
|
-webkit-text-fill-color: transparent;
|
||||||
-webkit-background-clip: text;
|
-webkit-background-clip: text;
|
||||||
-webkit-background-size: 200% 100%;
|
-webkit-background-size: 200% 100%;
|
||||||
-webkit-animation: masked-animation 1.5s infinite linear;
|
-webkit-animation: masked-animation 1.5s infinite linear;
|
||||||
font-family: "微软雅黑", serif;
|
font-family: "微软雅黑", serif;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
@-webkit-keyframes masked-animation {
|
@-webkit-keyframes masked-animation {
|
||||||
0% {
|
0% {
|
||||||
background-position: 0 0;
|
background-position: 0 0;
|
||||||
}
|
}
|
||||||
100% {
|
100% {
|
||||||
background-position: -100% 0;
|
background-position: -100% 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.content h1 a,
|
.content h1 a,
|
||||||
.content h1 span {
|
.content h1 span {
|
||||||
color: #399AB2 !important;
|
color: #399AB2 !important;
|
||||||
font-size: 30px;
|
font-size: 30px;
|
||||||
text-shadow: 2px 2px 5px grey;
|
text-shadow: 2px 2px 5px grey;
|
||||||
}
|
}
|
||||||
|
|
||||||
.content h2 a,
|
.content h2 a,
|
||||||
.content h2 span {
|
.content h2 span {
|
||||||
color: #60497C !important;
|
color: #60497C !important;
|
||||||
font-size: 26px;
|
font-size: 26px;
|
||||||
text-shadow: 2px 2px 5px grey;
|
text-shadow: 2px 2px 5px grey;
|
||||||
}
|
}
|
||||||
|
|
||||||
.content h3 a,
|
.content h3 a,
|
||||||
.content h3 span {
|
.content h3 span {
|
||||||
color: #346093 !important;
|
color: #346093 !important;
|
||||||
font-size: 22px;
|
font-size: 22px;
|
||||||
text-shadow: 2px 2px 5px grey;
|
text-shadow: 2px 2px 5px grey;
|
||||||
}
|
}
|
||||||
|
|
||||||
.content h4 a,
|
.content h4 a,
|
||||||
.content h4 span {
|
.content h4 span {
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
color: #78943A;
|
color: #78943A;
|
||||||
text-shadow: 2px 2px 5px grey;
|
text-shadow: 2px 2px 5px grey;
|
||||||
}
|
}
|
||||||
|
|
||||||
img.emoji {
|
img.emoji {
|
||||||
border: none;
|
border: none;
|
||||||
border-radius: 0;
|
border-radius: 0;
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<style>
|
<style>
|
||||||
.content > p {
|
.content > p {
|
||||||
font-size: 16px !important;
|
font-size: 16px !important;
|
||||||
line-height: 24px;
|
line-height: 24px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.content blockquote {
|
.content blockquote {
|
||||||
display: block;
|
display: block;
|
||||||
padding: 0 16px;
|
padding: 0 16px;
|
||||||
border-left: 8px solid #DDDFE4;
|
border-left: 8px solid #DDDFE4;
|
||||||
background: #FFF2C9;
|
background: #FFF2C9;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.content pre {
|
.content pre {
|
||||||
padding-left: 0 !important;
|
padding-left: 0 !important;
|
||||||
padding-right: 0 !important;
|
padding-right: 0 !important;
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
box-shadow: 1px 1px 20px 3px #DDDDDD !important;
|
box-shadow: 1px 1px 20px 3px #DDDDDD !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.content code {
|
.content code {
|
||||||
background-color: white;
|
background-color: white;
|
||||||
border-radius: 6px;
|
border-radius: 6px;
|
||||||
box-shadow: 1px 1px 1px whitesmoke;
|
box-shadow: 1px 1px 1px whitesmoke;
|
||||||
}
|
}
|
||||||
|
|
||||||
.content table {
|
.content table {
|
||||||
display: table;
|
display: table;
|
||||||
padding-left: 0 !important;
|
padding-left: 0 !important;
|
||||||
padding-right: 0 !important;
|
padding-right: 0 !important;
|
||||||
box-shadow: 2px 2px 20px 6px #DDDDDD !important;
|
box-shadow: 2px 2px 20px 6px #DDDDDD !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.content th {
|
.content th {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
background-color: #CCE6B6;
|
background-color: #CCE6B6;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<style>
|
<style>
|
||||||
@media (min-width: 600px) {
|
@media (min-width: 600px) {
|
||||||
.markdown-section pre > code {
|
.markdown-section pre > code {
|
||||||
font-size: 0.9rem !important;
|
font-size: 0.9rem !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: 600px) {
|
@media (max-width: 600px) {
|
||||||
.markdown-section pre > code {
|
.markdown-section pre > code {
|
||||||
padding-top: 5px;
|
padding-top: 5px;
|
||||||
padding-bottom: 5px;
|
padding-bottom: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
pre:after {
|
pre:after {
|
||||||
content: "" !important;
|
content: "" !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (min-width: 600px) {
|
@media (min-width: 600px) {
|
||||||
pre code {
|
pre code {
|
||||||
padding-left: 20px !important;
|
padding-left: 20px !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: 600px) {
|
@media (max-width: 600px) {
|
||||||
pre {
|
pre {
|
||||||
padding-left: 0px !important;
|
padding-left: 0px !important;
|
||||||
padding-right: 0px !important;
|
padding-right: 0px !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="app">正在加载...</div>
|
<div id="app">正在加载...</div>
|
||||||
|
@ -216,18 +216,14 @@
|
||||||
window.$docsify = {
|
window.$docsify = {
|
||||||
name: 'DB Tutorial',
|
name: 'DB Tutorial',
|
||||||
repo: 'https://github.com/dunwu/db-tutorial',
|
repo: 'https://github.com/dunwu/db-tutorial',
|
||||||
logo: 'http://dunwu.test.upcdn.net/images/others/zp_100_100.png',
|
logo: 'http://dunwu.test.upcdn.net/common/logo/zp_100_100.png',
|
||||||
auto2top: true,
|
auto2top: true,
|
||||||
coverpage: 'coverpage.md',
|
coverpage: 'coverpage.md',
|
||||||
maxLevel: 4,
|
maxLevel: 4,
|
||||||
subMaxLevel: 4,
|
subMaxLevel: 4,
|
||||||
formatUpdated: '{MM}/{DD} {HH}:{mm}',
|
formatUpdated: '{MM}/{DD} {HH}:{mm}',
|
||||||
search: {
|
search: {
|
||||||
maxAge: 86400000,
|
maxAge: 86400000, paths: ['/'], placeholder: '🔍 搜索', noData: '没有结果!', depth: 4
|
||||||
paths: ['/'],
|
|
||||||
placeholder: '🔍 搜索',
|
|
||||||
noData: '没有结果!',
|
|
||||||
depth: 4
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
- [MongoDB](mongodb)
|
- [MongoDB](mongodb)
|
||||||
- [Cassandra](Cassandra.md)
|
- [Cassandra](Cassandra.md)
|
||||||
|
|
||||||
## :books: 学习资源
|
## 📚 学习资源
|
||||||
|
|
||||||
## :door: 传送门
|
## :door: 传送门
|
||||||
|
|
||||||
|
|
|
@ -52,7 +52,7 @@ Redis 的复制功能分为同步和命令传播两个操作:
|
||||||
|
|
||||||
对于初次复制,旧版复制功能可用很好完成任务;但是对于断线后重复制,由于每次任然需要生成 RDB 并传输,效率很低。
|
对于初次复制,旧版复制功能可用很好完成任务;但是对于断线后重复制,由于每次任然需要生成 RDB 并传输,效率很低。
|
||||||
|
|
||||||
> :bulb: 注意:
|
> 💡 注意:
|
||||||
>
|
>
|
||||||
> **SYNC 命令是一个非常耗费资源的操作。**
|
> **SYNC 命令是一个非常耗费资源的操作。**
|
||||||
>
|
>
|
||||||
|
@ -100,7 +100,7 @@ Redis 的复制功能分为同步和命令传播两个操作:
|
||||||
|
|
||||||
复制积压缓冲区是由主服务器维护的一个固定长度的先进先出队列,默认大小为 1MB。
|
复制积压缓冲区是由主服务器维护的一个固定长度的先进先出队列,默认大小为 1MB。
|
||||||
|
|
||||||
> 注意:合理调整复制积压缓冲区的大小
|
> 🔔 注意:合理调整复制积压缓冲区的大小
|
||||||
>
|
>
|
||||||
> Redis 复制积压缓冲区默认大小为 1MB。
|
> Redis 复制积压缓冲区默认大小为 1MB。
|
||||||
>
|
>
|
||||||
|
|
|
@ -340,7 +340,7 @@ Redis 可以为每个键设置过期时间,当键过期时,会自动删除
|
||||||
|
|
||||||
可以使用 `EXPIRE` 或 `EXPIREAT` 来为 key 设置过期时间。
|
可以使用 `EXPIRE` 或 `EXPIREAT` 来为 key 设置过期时间。
|
||||||
|
|
||||||
> 注意:当 `EXPIRE` 的时间如果设置的是负数,`EXPIREAT` 设置的时间戳是过期时间,将直接删除 key。
|
> 🔔 注意:当 `EXPIRE` 的时间如果设置的是负数,`EXPIREAT` 设置的时间戳是过期时间,将直接删除 key。
|
||||||
|
|
||||||
示例:
|
示例:
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
{
|
{
|
||||||
"name": "db-tutorial",
|
"name": "db-tutorial",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "docsify serve ./ --port 4000"
|
"start": "docsify serve ./ --port 4000"
|
||||||
},
|
},
|
||||||
"dependencies": {},
|
"dependencies": {},
|
||||||
"devDependencies": {}
|
"devDependencies": {}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
- [mysql 命令](mysql-cli.md)
|
- [mysql 命令](mysql-cli.md)
|
||||||
- [mysql 原理](mysql-theory.md)
|
- [mysql 原理](mysql-theory.md)
|
||||||
|
|
||||||
## :books: 学习资源
|
## 📚 学习资源
|
||||||
|
|
||||||
### 官方
|
### 官方
|
||||||
|
|
||||||
|
|
|
@ -1007,7 +1007,7 @@ call getTotal();
|
||||||
>
|
>
|
||||||
> - 当触发器的触发条件满足时,将会执行 BEGIN 和 END 之间的触发器执行动作。
|
> - 当触发器的触发条件满足时,将会执行 BEGIN 和 END 之间的触发器执行动作。
|
||||||
>
|
>
|
||||||
> > 注意:在 MySQL 中,分号 `;` 是语句结束的标识符,遇到分号表示该段语句已经结束,MySQL 可以开始执行了。因此,解释器遇到触发器执行动作中的分号后就开始执行,然后会报错,因为没有找到和 BEGIN 匹配的 END。
|
> > 🔔 注意:在 MySQL 中,分号 `;` 是语句结束的标识符,遇到分号表示该段语句已经结束,MySQL 可以开始执行了。因此,解释器遇到触发器执行动作中的分号后就开始执行,然后会报错,因为没有找到和 BEGIN 匹配的 END。
|
||||||
> >
|
> >
|
||||||
> > 这时就会用到 `DELIMITER` 命令(DELIMITER 是定界符,分隔符的意思)。它是一条命令,不需要语句结束标识,语法为:`DELIMITER new_delemiter`。`new_delemiter` 可以设为 1 个或多个长度的符号,默认的是分号 `;`,我们可以把它修改为其他符号,如 `$` - `DELIMITER $` 。在这之后的语句,以分号结束,解释器不会有什么反应,只有遇到了 `$`,才认为是语句结束。注意,使用完之后,我们还应该记得把它给修改回来。
|
> > 这时就会用到 `DELIMITER` 命令(DELIMITER 是定界符,分隔符的意思)。它是一条命令,不需要语句结束标识,语法为:`DELIMITER new_delemiter`。`new_delemiter` 可以设为 1 个或多个长度的符号,默认的是分号 `;`,我们可以把它修改为其他符号,如 `$` - `DELIMITER $` 。在这之后的语句,以分号结束,解释器不会有什么反应,只有遇到了 `$`,才认为是语句结束。注意,使用完之后,我们还应该记得把它给修改回来。
|
||||||
>
|
>
|
||||||
|
|
|
@ -200,7 +200,7 @@ Hash 索引只有精确匹配索引所有列的查询才有效。
|
||||||
|
|
||||||
“独立的列” 是指索引列不能是表达式的一部分,也不能是函数的参数。
|
“独立的列” 是指索引列不能是表达式的一部分,也不能是函数的参数。
|
||||||
|
|
||||||
:x: 错误示例:
|
❌ 错误示例:
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
SELECT actor_id FROM sakila.actor WHERE actor_id + 1 = 5;
|
SELECT actor_id FROM sakila.actor WHERE actor_id + 1 = 5;
|
||||||
|
|
|
@ -122,11 +122,45 @@ T<sub>1</sub> 读取某个范围的数据,T<sub>2</sub> 在这个范围内插
|
||||||
|
|
||||||
| 隔离级别 | 脏读 | 不可重复读 | 幻影读 |
|
| 隔离级别 | 脏读 | 不可重复读 | 幻影读 |
|
||||||
| :------: | :--: | :--------: | :----: |
|
| :------: | :--: | :--------: | :----: |
|
||||||
| 未提交读 | ✔ | ✔ | ✔ |
|
| 未提交读 | ⭕ | ⭕ | ⭕ |
|
||||||
| 提交读 | ❌ | ✔ | ✔ |
|
| 提交读 | ❌ | ⭕ | ⭕ |
|
||||||
| 重复读 | ❌ | ❌ | ✔ |
|
| 重复读 | ❌ | ❌ | ⭕ |
|
||||||
| 串行化 | ❌ | ❌ | ❌ |
|
| 串行化 | ❌ | ❌ | ❌ |
|
||||||
|
|
||||||
|
### 分布式事务
|
||||||
|
|
||||||
|
在单一数据节点中,事务仅限于对单一数据库资源的访问控制,称之为 **本地事务**。几乎所有的成熟的关系型数据库都提供了对本地事务的原生支持。
|
||||||
|
|
||||||
|
**分布式事务** 是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。
|
||||||
|
|
||||||
|
#### 两阶段提交
|
||||||
|
|
||||||
|
两阶段提交(XA)对业务侵入很小。 它最大的优势就是对使用方透明,用户可以像使用本地事务一样使用基于XA协议的分布式事务。 XA协议能够严格保障事务 `ACID` 特性。
|
||||||
|
|
||||||
|
严格保障事务 `ACID` 特性是一把双刃剑。 事务执行在过程中需要将所需资源全部锁定,它更加适用于执行时间确定的短事务。 对于长事务来说,整个事务进行期间对数据的独占,将导致对热点数据依赖的业务系统并发性能衰退明显。 因此,在高并发的性能至上场景中,基于XA协议的分布式事务并不是最佳选择。
|
||||||
|
|
||||||
|
#### 柔性事务
|
||||||
|
|
||||||
|
如果将实现了`ACID`的事务要素的事务称为刚性事务的话,那么基于`BASE`事务要素的事务则称为柔性事务。 `BASE`是基本可用、柔性状态和最终一致性这三个要素的缩写。
|
||||||
|
|
||||||
|
- 基本可用(Basically Available)保证分布式事务参与方不一定同时在线。
|
||||||
|
- 柔性状态(Soft state)则允许系统状态更新有一定的延时,这个延时对客户来说不一定能够察觉。
|
||||||
|
- 而最终一致性(Eventually consistent)通常是通过消息传递的方式保证系统的最终一致性。
|
||||||
|
|
||||||
|
在`ACID`事务中对隔离性的要求很高,在事务执行过程中,必须将所有的资源锁定。 柔性事务的理念则是通过业务逻辑将互斥锁操作从资源层面上移至业务层面。通过放宽对强一致性要求,来换取系统吞吐量的提升。
|
||||||
|
|
||||||
|
基于`ACID`的强一致性事务和基于`BASE`的最终一致性事务都不是银弹,只有在最适合的场景中才能发挥它们的最大长处。 可通过下表详细对比它们之间的区别,以帮助开发者进行技术选型。
|
||||||
|
|
||||||
|
### 事务方案对比
|
||||||
|
|
||||||
|
| *本地事务* | *两(三)阶段事务* | *柔性事务* | |
|
||||||
|
| :--------- | :----------------- | :-------------- | --------------- |
|
||||||
|
| 业务改造 | 无 | 无 | 实现相关接口 |
|
||||||
|
| 一致性 | 不支持 | 支持 | 最终一致 |
|
||||||
|
| 隔离性 | 不支持 | 支持 | 业务方保证 |
|
||||||
|
| 并发性能 | 无影响 | 严重衰退 | 略微衰退 |
|
||||||
|
| 适合场景 | 业务方处理不一致 | 短事务 & 低并发 | 长事务 & 高并发 |
|
||||||
|
|
||||||
## 2. 并发控制
|
## 2. 并发控制
|
||||||
|
|
||||||
无论何时,只要有多个查询需要在同一时刻修改数据,就会产生并发控制的问题。
|
无论何时,只要有多个查询需要在同一时刻修改数据,就会产生并发控制的问题。
|
||||||
|
@ -161,7 +195,7 @@ T<sub>1</sub> 读取某个范围的数据,T<sub>2</sub> 在这个范围内插
|
||||||
| 锁类型 | X | S |
|
| 锁类型 | X | S |
|
||||||
| :----: | :-: | :-: |
|
| :----: | :-: | :-: |
|
||||||
| X | ❌ | ❌ |
|
| X | ❌ | ❌ |
|
||||||
| S | ❌ | ✔ |
|
| S | ❌ | ⭕ |
|
||||||
|
|
||||||
#### 意向锁
|
#### 意向锁
|
||||||
|
|
||||||
|
@ -181,9 +215,9 @@ T<sub>1</sub> 读取某个范围的数据,T<sub>2</sub> 在这个范围内插
|
||||||
| 锁类型 | X | IX | S | IS |
|
| 锁类型 | X | IX | S | IS |
|
||||||
| :----: | :-: | :-: | :-: | :-: |
|
| :----: | :-: | :-: | :-: | :-: |
|
||||||
| X | ❌ | ❌ | ❌ | ❌ |
|
| X | ❌ | ❌ | ❌ | ❌ |
|
||||||
| IX | ❌ | ✔ | ❌ | ✔ |
|
| IX | ❌ | ⭕ | ❌ | ⭕ |
|
||||||
| S | ❌ | ❌ | ✔ | ✔ |
|
| S | ❌ | ❌ | ⭕ | ⭕ |
|
||||||
| IS | ❌ | ✔ | ✔ | ✔ |
|
| IS | ❌ | ⭕ | ⭕ | ⭕ |
|
||||||
|
|
||||||
解释如下:
|
解释如下:
|
||||||
|
|
||||||
|
@ -822,3 +856,4 @@ Sname, Sdept 和 Mname 都部分依赖于键码,当一个学生选修了多门
|
||||||
- [分库分表需要考虑的问题及方案](https://www.jianshu.com/p/32b3e91aa22c)
|
- [分库分表需要考虑的问题及方案](https://www.jianshu.com/p/32b3e91aa22c)
|
||||||
- [数据库分库分表(sharding)系列(二) 全局主键生成策略](https://blog.csdn.net/bluishglc/article/details/7710738)
|
- [数据库分库分表(sharding)系列(二) 全局主键生成策略](https://blog.csdn.net/bluishglc/article/details/7710738)
|
||||||
- [一种支持自由规划无须数据迁移和修改路由代码的 Sharding 扩容方案](https://blog.csdn.net/bluishglc/article/details/7970268)
|
- [一种支持自由规划无须数据迁移和修改路由代码的 Sharding 扩容方案](https://blog.csdn.net/bluishglc/article/details/7970268)
|
||||||
|
- https://shardingsphere.apache.org/document/current/cn/features/transaction/
|
||||||
|
|
|
@ -128,7 +128,7 @@ seq name file
|
||||||
2 test /root/test.db
|
2 test /root/test.db
|
||||||
```
|
```
|
||||||
|
|
||||||
> 注意:数据库名 **`main`** 和 **`temp`** 被保留用于主数据库和存储临时表及其他临时数据对象的数据库。这两个数据库名称可用于每个数据库连接,且不应该被用于附加,否则将得到一个警告消息。
|
> 🔔 注意:数据库名 **`main`** 和 **`temp`** 被保留用于主数据库和存储临时表及其他临时数据对象的数据库。这两个数据库名称可用于每个数据库连接,且不应该被用于附加,否则将得到一个警告消息。
|
||||||
|
|
||||||
### 分离数据库
|
### 分离数据库
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue