0%

数据库速通笔记

考前一天总算肝出来了(),感觉还是蛮有意思的。

数据库的基本概念

  1. 描述事物的符号记录称为数据

    数据和语义是不可分的。

  2. 数据库长期储存在计算机内、有组织的、可共享的大量数据的集合。数据库中的数据按一定的数据模型组织、描述和储存,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共享

  1. 数据库管理系统能够科学地组织和存储数据高效的获取和维护数据。一般有以下几个特点

    1. 数据定义功能

      提供数据定义语言,用户可以使用它对数据库中的数据对象的组成和结构进行定义。

    2. 数据组织、存储和管理

      数据管理系统分类组织、存储和管理各种数据。确定具体存储数据的形式,如何实现数据之间的联系。提供多种存取方法(索引查找、hash查找、顺序查找等)以提高存取效率。

    3. 数据操纵功能

      数据库管理系统还提供数据操纵语言,用户可以使用它操纵数据,实现对数据库的基本操作,如查询、插入、删除和修改等。

    4. 数据库的事务管理和运行管理

      数据库在建立、运用和维护时由数据库管理系统统一管理和控制以保证事务的正确运行保证数据的安全性、完整性、并发正确性以及发生故障后的系统恢复

    5. 数据库的建立和维护功能

      包括数据库初始数据的输入、转换功能,数据库的转储、恢复功能,数据库的重组织功能和性能监视、分析功能等。通常由一些实用程序或管理工具完成。

    6. 其他功能

      包括和其他软件系统的通信功能,一个数据库管理系统和另一个数据库管理系统或文件系统的数据转换功能异构数据库之间的互相访问和互相操作功能

  2. 数据库系统是由数据库、数据库管理系统(及其应用开发工具)、应用程序和数据库管理员组成的存储、管理、处理和维护数据的系统。

其层次结构如下表示

1
应用程序--->应用开发工具--->数据库管理系统--->操作系统--->硬件

文件系统数据库系统标志着数据管理系统的飞跃。

数据模型

数据模型对现实世界数据特征的抽象数据模型数据库系统核心和基础。分为两大类,概念模型 和 逻辑模型物理模型,属于不同的层次。

数据模型的组成要素

数据模型通常由数据结构、数据操作和数据的完整性约束条件三部分组成

  1. 数据结构描述数据库的组成对象以及对象之间的联系

  2. 数据操作是指对数据库中各种对象的实例允许执行的操作的集合,包括操作及有关的操作规则。

  3. 数据的完整性约束条件是一组完整性规则。

1
2
3
        认识抽象
现实世界--------->概念模型------>数据库管理系统支持的数据模型
信息世界 机器世界

概念模型

按用户的观点对数据和信息建模,主要用于数据库设计。

基本概念

  1. 客观存在并可相互区别的事物称为实体

  2. 实体所具有的某一特性称为属性

  3. 唯一标识实体属性称为

  4. 用实体名及其属性名集合来抽象和刻画同类实体,称为实体型

  5. 同一类型实体的集合称为实体集

  6. 实体之间的联系通常是指不同实体集之间的联系

    实体之间的联系有一对一、一对多和多对多等多种类型

实体-联系方法 Entity-Relationship approach

E-R方法也称为E-R模型

逻辑模型和

逻辑模型层次模型网状模型关系模型面向对象数据模型对象关系模型半结构化数据数据模型。主要介绍前三种模型。

层次模型

层次模型是一颗树,每一个点定义了一个表结构。每一个表结构里的事例能够查找到点的孩子的一些实例,能满足一对多且每一个关系对应一个父关系的需要。

网状模型

网状模型是一个图,每一个点定义了一个表结构。每一个表结构里的事例均可能找到多个父亲和孩子实例,能满足多对多的需要。

关系模型

关系模型的数据结构
  • 关系:一张表
  • 元组:表中的一行
  • 属性:表中的一列
  • 属性组:表中的数列
  • 码/键(key):表中的某个属性组能惟一确定学生
  • 域:一组具有相同数据类型的值的集合
  • 分量:元组的一个属性值
关系模型的数据操纵与完整性约束

操作对象和操作结果都是关系

物理模型

物理模型对数据最底层的抽象,描述数据在系统内部的物理表示方式和存取方法。

首先将现实世界抽象为信息世界,然后将信息世界转换为机器世界。

数据库系统的结构

数据库系统的三级模式结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
- 数据库
- 内模式
(模式/内模式映像)
- 模式
(外模式/模式映像)
- 外模式1
- 应用A
- 应用B
- 外模式2
- 应用C
- 应用D
- 外模式3
- 应用E
- 应用F

模式

模式也称逻辑模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。

外模式

外模式也称子模式或用户模式,它是数据库用户能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。

内模式

内模式也称存储模式,一个数据库只有一个内模式。它是数据库物理结构和存储方式的描述,是数据在数据库内部的组织方式。

数据库的二级映像功能和数据独立性

这两层映像分别保证了数据库系统中的数据能具有较高的逻辑独立性和物理独立性。

数据的逻辑独立性使数据的定义和描述可以从应用程序中分离出去,由于数据的存取由数据库管理系统管理,从而简化了应用程序的编制,大大减少了应用程序的维护和修改。

外模式/模式映像

当模式改变时,由数据库管理员对各个外模式/模式的映像作相应改变,可以使外模式保持不变。应用程序是依据数据的外模式编写的,从而应用程序无需修改,保证了数据和程序的逻辑独立性,简称数据的逻辑独立性。

模式/外模式映像

当数据库的存储结构改变时,由数据库管理员对模式/内模式映像作出相应改变,可以是模式保持不变,从而应用程序也不必改变。保证了数据与程序的无力独立性,简称数据的物理独立性。

关系数据库

关系数据结构及形式化定义

关系模型的数据结构

是一组具有相同数据类型的集合。

笛卡尔积×\times组成元组的集合。

D1,D2,,DnD_1,D_2,\cdots,D_n上的关系RRDi\prod D_i的子集。n决定是几元关系,

表示为R(D1,D2,,Dn)R(D_1,D_2,\cdots,D_n)

若关系中的某一属性组能唯一标识一个元组,而其子集不能,则称该属性组为候选码

若关系有多个候选码,则选定一个为主码

候选码的每个属性称为主属性,不包含在任何候选码中的属性称为非主属性非码属性

无论什么情况,一个关系都存在候选码,最坏情况向候选码就是所有属性,称为全码。

关系模型

关系被应用于关系数据模型时需要满足

  1. 关系必须有限

  2. 通过在关系每一个列附加一个属性名的方法取消关系属性的有序性

关系被应用于表模型时有三种类型:基本关系(基本表)、查询表和视图表。

基本关系有以下6条性质

  1. 列是同质的
  2. 不同的列可以出自同一个域
  3. 列的顺序无所谓
  4. 行的顺序无所谓
  5. 任意两个元组的候选码不能取相同的值
  6. 分量必须不可再分

关系模式

关系模式描述了关系RR

R(U,D,DOM,F)R(U,D,DOM,F)

UU是属性名集合

DDUU中属性所来自的域

DOMDOM为属性向域的映像集合。

关系操作

关系操作是定义在元组集合上的运算。

1
2
3
4
5
6
7
8
9
10
11
- 查询
- 选择
- 投影
- 连接
- 除
- 并
- 差
- 交
- 插入
- 删除
- 修改

关系数据语言

1
2
3
4
5
6
关系数据语言
- 关系代数语言(ISBL)
- 关系演算语言
- 元组关系演算语言(ALPHA、QUEL)
- 域关系演算语言(QBE)
- 具有关系代数和关系演算双重特点的语言(SQL)

关系完整性

关系模型中有三类完整性约束:实体完整性、参照完整性和用户定义的完整性。

其中实体完整性和参照完整性是关系模型必须满足的完整性约束条件,称作是关系的两个不变性。

实体完整性

实体完整性规则:若属性AA是基本关系RR的主属性,则AA不能取空值。

参照完整性

FF是基本关系RR的一个或一组属性,但不是关系RR的码,KsK_s是基本关系SS的``。如果FFKsK_s相对应,则称FFRR的外码,并称基本关系RR为参照关系,基本关系SS为被参照关系或目标关系。

(即关系的某个属性组能跟其他关系的``建立双射)

参照完整性规则:若属性(或属性组)FF是基本关系RR的外码,他与基本关系SS的``KsK_s相对应(RR可以等于SS),则对于RR中的每个元组在FF上的值必须:

  • 或者全为空
  • 或者等于SS中某个元组的值

(即双射建立在外码非空时的全等关系上)

关系代数

沿袭自传统的集合运算:并\cup,差\land,交\cap,笛卡尔积×\times

专门的关系运算

  • 选择σF(R)={ttRF(t)}\sigma_F(R)=\{t|t\in R \land F(t)\},其中FF是谓词

  • 投影ΠA(R)=t[A]tR\Pi_A(R)={t[A]|t\in R},其中AARR中的属性组或者属性

  • 连接RAθBS={trtstrRtsStr[A]θts[B]}R\underset{A\theta B}\Join S=\{\stackrel{\frown}{t_rt_s}|t_r\in R \land t_s \in S \land t_r[A]\theta t_s[B]\},其中AABB分别为RRSS上列数相等且可比的属性组,θ\theta是比较运算符

  • 自然连接是两关系相同属性组成的属性组应用相等运算符得到的关系。

    被舍弃的元组称为悬浮元组
    如果把悬浮元组也保存在结果关系中,而在其他属性上填空值,那么这种连接称为外连接RSR\LARGE ⟗\normalsize S,如果只保留左边关系RR中的悬浮元组就叫做左外连接RSR\LARGE ⟕ \normalsize S,同理只保留右边关系叫做右外连接,记作RSR\LARGE ⟖\normalsize S

  • 除运算R÷S={tr[X]trRΠY(S)YX}R\div S=\{t_r[X] | t_r \in R\land \Pi_Y(S)\subseteq Y_X\} ,其中关系R(X,Y)R(X,Y)和关系S(Y,Z)S(Y,Z)YY可以有不同的属性名,但必须属于相同的域集,YxY_xxxRR中的象集,x=tr[X]x=t_r[X]

    也即R÷S={tr[X]trRtr[X]×SRR\div S=\{t_r[X] | t_r \in R\land t_r[X]\times S\in R

SQL

关系数据语言

SQL中同样支持关系数据库三级模式结构

1
2
3
4
5
6
7
8
----外部应用程序--
| | |
| 视图1 视图2 外模式
| | |----------|
基本表1 基本表2 基本表3 基本表4 模式
| | | |
-----------------| |
|存储文件1 存储文件2 内模式

下表列出了常用的基本命令

SQL功能 动词
数据查询 SELECT
数据定义 CREATE,DROP,ALTER
数据语句 INSERT,UPDATE,DELETE
数据控制 GRANT,REVOKE

下文中将用巴科斯范式描述SQL语言

数据定义

下表列出了数据定义语句

操作对象 操作方式
创建(CREATE) 删除(DROP) 修改(ALTER)
模式(SCHEMA) CREATE SCHEMA DROP SCHEMA 不存在
表(TABLE) CREATE TABLE DROP TABLE ALTER TABLE
视图(VIEW) CREATE VIEW DROP VIEW 不存在
索引(INDEX) CREATE INDEX DROP INDEX ALTER INDEX

模式

1
2
3
CREATE SCHEMA <模式名> AUTHORIZATION <用户名> [<表定义子句> | <视图定义子句> | <授权定义子句>]
DROP SCHEMA <模式名> <CASCADE|RESTRICT>
/*RESTRICT相当于rmdir,CASCADE相当于rm -r*/

创建模式相当于创建了一个命名空间。

模式与表

可以通过"<模式名>.<表名>"充当<表名>显式指定一个表,如果不给出则查找搜索路径。

搜索路径是一个模式列表,依次尝试每个模式中代入运行。

1
2
SHOW seach_path;
SET search_path TO "S-T",PUBLIC;

1
2
3
4
5
CREATE TABLE <表名>(<列名> <数据类型> [列级完整性约束条件]
[,<列名> <数据类型> [列级完整性约束条件]]
[,<列名> <数据类型> [列级完整性约束条件]]
[,<表级完整性约束条件>]);
DROP

其中数据类型如下表

数据类型 含义
CHAR(n) char[n]
VARCHAR(n) 最大长度为n的变长字符串
CLOB 字符串大对象
BLOB 二进制大对象
SMALLINT i16
INT i32
BIGINT i64
NUMERIC(p,d),DECIMAL(p,d),DEC(p,d) p位数字小数点后d位定点数
REAL float
DOUBLE PRECISION double
FLOAT(n) 位数大于n的浮点数
BOOLEAN bool
DATE 日期,YYYY-MM-DD
TIME 时间,HH:MM:SS
TIMESTAMP 时间戳
INTERVAL 时间间隔
1
2
3
4
5
6
7
8
9
ALTER TALBE <表名>
[ADD [COLUMN] <新列名> <数据类型> [完整性约束]]
[ADD <表级完整性约束>]
[DROP [COLUMN] <列名> [CASCADE|RESTRICT]]
/*删除列*/
[DROP CONSTRAINT <完整性约束名> [CASCADE|RESTRICT]]
/*删除约束*/
[ALTER COLUMN <列名> <数据类型>] ;
/*改变列名的数据类型*/
1
DROP TABLE <表名> [CASCADE|RESTRICT] ;

索引

1
2
CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON <表名>(<列名> [<次序>][,<列名> [<次序>]]...)

<次序>可选DESCASC

1
ALTER INDEX <旧索引名> RENAME TO <新索引名>
1
DROP INDEX <索引名>

数据查询

单个表查询

1
2
3
4
5
SELECT [ALL|DISDINCT] <目标列表达式>[,<目标列表达式>]...
FROM <表名或视图名> | (<SELECT语句>) [AS] <别名>
[WHERE <条件表达式>]
[GROUP BY <列名 1> [HAVING <条件表达式>]]
[ORDER BY <列名 2> [ASC|DESC]]

<条件表达式>是接收一个元组的谓词,可以使用所有比较符、NOTBETWEEN ANDINLIKE(字符串匹配)、IS NULL

IN接受一个SELECT子句,这个SELECT子句被称为子查询,如果子查询的WHERE不依赖父查询,则称不相关子查询。反之则是相关子查询,整个查询子句称为相关嵌套查询。

<目标列表达式>以及条件表达式中除了使用属性名外,也可以使用聚焦函数对每个组(如果有的话)进行属性的计算之后筛选。有以下聚焦函数

1
2
3
4
5
6
COUNT(*)                          计数
COUNT([DISTINCT|ALL] <列名>) 统计一列中值的个数
SUM([DISTINCT|ALL] <列名>) 求和(必须是数值)
AVG([DISTINCT|ALL] <列名>) 平均
MAX([DISTINCT|ALL] <列名>) 最大
MIN([DISTINCT|ALL] <列名>) 最小

其中ORDER BY只能在最外层使用。

多个表查询

上述<表名或视图名>也可以为多个表,按照命名空间查询规则查询条件表达式中属性的来源。

1
<表名/视图名 1>[连接修饰][,<表名/视图名 2>[连接修饰]]

默认从笛卡尔积上查询。连接修饰可以单纯是[名字]表示别名(自身笛卡尔积);也可以LEFT OUTER JOIN SC ON(<条件表达式>)左连接等表示连接的谓词。

查询的组合

查询的结果是一个集合,也可以进行集合的操作:并UNION、交INTERSECT和差EXCEPT

查询的一般形式

1
2
3
4
5
SELECT [ALL|DISTINCT] <目标列表达式> [别名] [,<目标列表达式 [别名]>]...
FROM <表名或视图名> [别名] [,<表名或视图名>[别名]]...|(<SELECT 语句>) [AS] <别名>
[WHERE <条件表达式>]
[GROUP BY <列名> [HAVING <条件表达式>]]
[ORDER BY <列名> [ASC|DESC]];
1
2
3
4
5
6
7
8
9
10
11
<目标列表达式>*                                                      | 
<表名> .* |
COUNT([DISTINCT|ALL]*) |
[<表名>.]<属性列名表达式> [,[<表名>.]<属性列名表达式>]...

<WHERE条件表达式> : <属性列名> <操作符> {<属性列名> | <常量> | [ANY|ALL] (<SELECT语句>)} |
<属性列名> [NOT] BETWEEN {<属性列名> | <常量> | (<SELECT语句>)} AND {<属性列名> | <常量> | (<SELECT语句>)} |
<属性列名> [NOT] IN {(<1>[,<2>]...),(<SELECT语句>)} |
<属性列名> [NOT] LIKE <匹配串>
[NOT] EXISTS (<SELECT 语句>)
<条件表达式> {AND|OR} <条件表达式> [{AND|OR} <条件表达式>]...

数据更新

插入常量

1
2
3
INSERT
INTO <表名> [(<属性列1>,[,<属性列2>]...)]
VALUES (<常量1>[,<常量2>]...);

插入查询结果

1
2
3
INSERT
INTO <表名> [(<属性列1>,[,<属性列2>]...)]
<子查询>;

修改元组

1
2
3
UPDATE <表名>
SET <列名>=<表达式> [,<列名>=<表达式>]...
[WHERE <条件表达式>];

WHERE条件表达式

删除数据

1
2
3
DELETE
FROM <表名>
[WHERE <条件表达式>];

定义视图(外模式)

1
2
3
CREATE VIEW <视图名> [(<列名> [,<列名>]...)]
AS <子查询>
[WITH CHECK OPTION];

WITH CHECK OPTION表示修改视图时是否要保证满足视图中子查询的条件。

视图的可更新话题过于深奥,简单的视图是可以更新的。

关系数据理论

关系模式

依赖

数据重复一直是关系模式中很大的问题,对此引入了数据依赖。

数据依赖:一个关系内部属性和属性之间的一种约束关系,这种约束关系是通过属性间值的相等与否体现出来的数据间相关联系。

对于这么一个表中存在以下问题

Sno Sname Cname
0 小张 数据结构
1 小红 数据结构
1 小红 高等数学
2 小明 数据结构
  1. 数据冗余

没有引用这个概念,相同数据(小红名字)以值相同来标记,浪费了空间。

  1. 更新异常

因为没有引用,导致如果要进行更换课程名这种层次比较高的操作,需要更新非常大的数据。

  1. 插入异常

如果一个课刚开办,没有学生,则无法存入数据库。

  1. 删除异常

如果一个课程的学生全部毕业了,则删除完成后课程信息也丢失了。

规范化

数据依赖主要分为函数依赖和多值依赖。

函数依赖

一个平凡的思想在关系模式中尝试找到一个函数ff从属性组(T1,T2,...)(T1,T2,...)映射到一个属性SS,表示为(T1,T2,...)(T1,T2,...)->SS,那么就可以通过数据结构高速维护这个关系。

如果XYX\rarr Y,但Y⊈XY\not\subseteq X,则称XYX\rarr Y是非平凡的函数依赖。

如果XYX\rarr Y,但YXY\subseteq X,则称XYX\rarr Y平凡的函数依赖

如果XYX\rarr Y,则XX称为这个函数依赖的决定属性组,也被称为决定因素。

如果XYX\rarr YYXY\rarr X,则记作XYX\larr\rarr Y

YY不函数依赖XX,则记作X↛YX\not\rarr Y

R(U)R(U)中,如果XYX\rarr Y,并且对于XX的任何一个真子集XX',都有X↛YX'\not\rarr Y,则称YYXX完全函数依赖,记作XFYX \stackrel{F}{\rarr}Y

如果XYX\rarr Y,但YY不完全函数依赖XX,则称YYXX部分函数依赖。

如果XY,Y↛X,YZ,Z⊈YX\rarr Y,Y\not\rarr X,Y\rarr Z,Z\not\subseteq Y则称ZZXX传递函数依赖。

KKR<U,F>R\text <U,F\text >中的属性或属性集合,若KFUK\stackrel{F}{\rarr}U,则称KKRR候选码

如果KUK\rarr U,则KK称为超码,候选码是特殊的超码。

如果候选码多于一个,则选定其中一个为主码

包含在任何一个候选码中的属性为主属性,不包含在任何候选码的属性称为非主属性或非码属性。最简单的情况,单个属性是码;最极端的情况,整个属性组是码,称为全码。``和候选码都可以称为码。

对于码A,BA,BABA\larr\rarr B

范式

类似X型文法。

5NF4NFBCNF3NF2NF1NF5NF\subset4NF\subset BCNF\subset 3NF \subset 2NF \subset 1NF

一个低一级(编号低)的范式的关系模式通过模式分解可以转换为若干个高一级范式的关系模式的集合,这个过程被称为规范化。

以下条件依次加强。

1NF

每一个分量不可再分。

2NF

每一个非主属性完全函数依赖于任何一个候选码

多加了其他关系进去,如果A->B,(A,C)->D把ABCD混进一个关系模式中就会不满足2NF
3NF

设关系模式R<U,F>1NFR\text <U,F\text >\in \text{1NF},若RR中不存在码XX,属性组YY非主属性Z(Z⊈Y)Z(Z\not\subseteq Y)使得XY,YZX\rarr Y,Y\rarr Z成立,Y↛XY\not\rarr X,则称R<U,F>3NFR\text<U,F\text>\in \text{3NF}

不存在传递依赖,如果A->B,B->C把ABC混进一个关系模式中就会不满足3NF,但满足2NF

多值依赖

关系模式R(U)R(U)中多值依赖XYX\rarr\rarr Y成立,当且仅当rR(U),Z=UXY\forall r\in R(U),Z=U-X-Y,给定的一对(x,z)(x,z)值,有一组YY的值,这组值仅仅决定于xx值而与zz值无关。

XYX\rarr \rarr Y,而Z=Z=\empty,则称XYX\rarr \rarr Y为平凡的多值依赖。即UX=YU-X=Y

(x,z)R(X,Z),ΠY(σX=x,Z=z(R))ΠY(σX=x(R))\forall (x,z)\in R(X,Z),\Pi_Y(\sigma_{X=x,Z=z}(R))\cap \Pi_Y(\sigma_{X=x}(R))\not= \emptyset

  • 对称性:XYX\rarr \rarr YXUXYX\rarr \rarr U-X-Y
  • 传递性:XY,YZX\rarr\rarr Y,Y\rarr\rarr ZXZYX\rarr\rarr Z-Y
  • 函数依赖是多值依赖的特殊情况:XYX\rarr YXYX\rarr\rarr Y

4NF

关系模式R<U,F>1NFR\text <U,F\text >\in \text{1NF},若对于RR中每个非平凡多值依赖XY(Y⊈X)X\rarr\rarr Y(Y\not\subseteq X),X都含有码,则称R<U,F>4NFR\text<U,F\text>\in \text{4NF}

数据库设计

需求分析->概念结构设计阶段->逻辑结构设计阶段->物理结构设计阶段

概念结构设计

E-R模型

E-R模型/图分为三种节点(实体,属性,联系)

实体用长方形表示,属性用椭圆表示,联系用棱形表示。

实体即对象,属性即成员变量,联系即实体之间的动词,联系也可以有属性。

实体之间的联系有三种情况

  • 一对一(1:1)
  • 一对多(1:n)
  • 多对多(m:n)

线程和进程?

其中的n/m/1在联系和实体之间连线上标注。

扩展的E-R模型

ISA(is a)联系

实体之间的继承关系可以用三角形连接实体,上面表示父实体,标注继承信息。

如果不存在同时是

基数约束

基数约束是对实体间一对一、一对多和多对多联系的细化。

约束用一个数对min…max表示。

Part-of联系

如果一个实体存在的话必须依赖另一个实体存在。则称为弱实体型,否则称为强实体型。

弱实体型用双边框的长方形表示,这个依赖关系用双边框的棱形表示。

逻辑结构设计

  1. 一个1:1的联系可以转换为一个独立的关系模式,也可以与任意一端对应的关系模式合并。

  2. 一个1:n的联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并。

  3. 一个m:n联系转换为一个关系模式。

  4. 三个或三个以上的实体间的一个多元联系可以转换为一个关系模式。

  5. 具有相同码的关系模式可以合并。

事务处理

事务是用户定义的一个数据库操作序列,事务具有原子性。

扩展阅读:C++事务性内存

事务具有ACID特性

  • 原子性(Atomicity)

  • 一致性(Consistency)

    事务的执行成功不会破坏数据库的一致性状态。

  • 隔离性(Isolation)

    并发的事务之间不能干扰,其结果和不并发的结果一致。

  • 持续性(Durability)

    如果事务成功,则这个事务的成功不会在之后变成失败。

Welcome to my other publishing channels