数据库基础
数据库索引
- 数据库索引是对数据库表中一列或多列的值进行排序的一种结构, 是为了增加查询速度而对表字段附加的一种标识。
DB
在执行一条Sql
语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合。- 如果我们对某一字段增加索引,查询时就会先去索引列表中一次定位到特定值的行数,大大减少遍历匹配的行数,所以能明显增加查询的速度。
数据库事务
- 数据库事务
(Database Transaction)
,是指对单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 - 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则
不会
永久更新面向数据的资源。 - (操作) 通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。
- (事务) 一个逻辑工作单元要成为事务,必须满足所谓的
ACID
(原子性(Atomicity)
、一致性(Consistency)
、隔离性(Isolation)
、持久性(Durability))
属性。事务是数据库运行中的逻辑工作单位,由DBMS
中的事务管理子系统负责事务的处理。
数据库事务隔离
- 隔离性
(Isolation)
-
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
- 即要达到这么一种效果:对于任意两个并发的事务
T1
和T2
,在事务T1
看来,T2
要么在T1
开始之前就已经结束,- 要么在
T1
结束之后才开始, - 这样每个事务都感觉不到有其他事务在并发地执行。
- 即要达到这么一种效果:对于任意两个并发的事务
-
多个并发事务相互隔离,即一个事务不应该影响其它事务运行效果。
- 这指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。
- 由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。
-
不同的隔离级别:
Read Uncommitted
(读取未提交内容):最低的隔离级别,什么都不需要做,一个事务可以读到另一个事务未提交的结果。所有的并发事务问题都会发生。Read Committed
(读取提交内容):只有在事务提交后,其更新结果才会被其他事务看见。可以解决脏读问题。Repeated Read
(可重复读):在一个事务中,对于同一份数据的读取结果总是相同的,无论是否有其他事务对这份数据进行操作,以及这个事务是否提交。可以解决脏读、不可重复读。Serialization
(可串行化):事务串行化执行,隔离级别最高,牺牲了系统的并发性。可以解决并发事务的所有问题。
-
inner join
, left join
, right join
,full join
inner join(内连接)
: 只返回两个表中联结字段相等的行left join(左联接)
: 返回包括左表中的所有记录和右表中联结字段相等的记录right join(右联接)
: 返回包括右表中的所有记录和左表中联结字段相等的记录full join(外连接)
: 返回两个表中的行
数据库事务的一致性
-
事务(Transaction)
是由 一系列对系统中数据进行访问与更新的操作 所组成的一个程序执行逻辑单元。 -
事务是
DBMS
中最基础的单位,它不可分割。
-
事务具有4个基本特征
(ACID)
,分别是:原子性(Atomicity)
、一致性(Consistency)
、隔离性(Isolation)
、持久性(Duration)
,简称ACID
。 -
原子性
(Atomicity)
- 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
-
一致性
(Consistency)
- 一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
- 拿转账来说,假设用户
A
和用户B
两者的钱加起来一共是5000
,那么不管A
和B
之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000
,这就是事务的一致性。
-
隔离性
(Isolation)
- 隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
- 即要达到这么一种效果:对于任意两个并发的事务
T1
和T2
,在事务T1
看来,T2
要么在T1
开始之前就已经结束,- 要么在
T1
结束之后才开始, - 这样每个事务都感觉不到有其他事务在并发地执行。
- 即要达到这么一种效果:对于任意两个并发的事务
- 多个并发事务相互隔离,这指的是
- 在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。
- 由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。
- 不同的隔离级别:
Read Uncommitted
(读取未提交内容):最低的隔离级别,什么都不需要做,一个事务可以读到另一个事务未提交的结果。所有的并发事务问题都会发生。Read Committed
(读取提交内容):只有在事务提交后,其更新结果才会被其他事务看见。可以解决脏读问题。Repeated Read
(可重复读):在一个事务中,对于同一份数据的读取结果总是相同的,无论是否有其他事务对这份数据进行操作,以及这个事务是否提交。可以解决脏读、不可重复读。Serialization
(可串行化):事务串行化执行,隔离级别最高,牺牲了系统的并发性。可以解决并发事务的所有问题。
- 隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
-
持久性
(Durability)
- 持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
- 例如我们在使用
JDBC
操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。
索引是什么,多加索引一定会好吗
- 索引
- 数据库索引是对数据库表中一列或多列的值进行排序的一种结构, 是为了增加查询速度而对表字段附加的一种标识。
DB
在执行一条Sql
语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合。- 如果我们对某一字段增加索引,查询时就会先去索引列表中