数据库浅谈

*什么是数据库?数据库是按照数据结构来组织,存储和管理数据的仓库

*数据库管理系统:数据库软件(mysql,oracle,sql server等)

*数据库的设计过程?现实世界——需求分析——概要设计——逻辑设计——物理设计

*数据库的结构(三层):物理数据层(内模式);概要数据层(概要模式);用户数据层(外层模式)

*数据库的分类:层次式数据库,网络式数据库,关系式数据库

*SQL语言是数据库的核心语言:SQL语言分为四大类

DDL(数据定义语言):用来创建数据库中的各种对象(表,视图,索引等)

DML(数据操作语言):插入/更新/删除操作

DQL(数据查询语言):select/from/where子句组成的查询块

DCL(数据控制语言):用来授予或回收数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行件事等,如:

  1. Grand:授权
  2. Rollback [work] to [savepoint]:回退到某一点
  3. Rollback回滚

*数据库事务:是指作为单个逻辑工作单位执行的一系列操作,是并发控制的基本单位

*事务的语句:

 开始事务:BEGIN TRANSACTION(事务)

 提交事务:COMMIT TRANSACTION(事务)

 回滚事务:ROLLBACK TRANSACTION(事务)

事务的提出主要是为了解决并发情况下保持数据的一致性的问题

*事务的四大特性:原子性,一致性,隔离性,持久性

*数据库中存在的问题:更新丢失,脏读,不可重复读,幻读

        (1)更新丢失:多个线程操作,基于同一查询结构对表中的记录进行修改,后修改的记录将会覆盖前面修改的记录,前面的修改就会丢失掉,这叫更新丢失

        解决办法:对行加锁,只允许并发一个更新事务

        (2)脏读:A事务读取B事务尚未提交的数据并在此基础上操作,而B事务执行回滚操作,那么A读取到的数据就是脏数据

        解决办法:在一个事物提交之前,任何其他事务不可读取其修改过的值

        (3)不可重复读(Non-repeatable Reads):一个事务对同一行数据重复读取两次,但却得到了不同的结果。事务T1读取某一数据之后,事务T2对其进行了修改,当事务T1再次读取该数据时就会得到与前一次不同的值

        解决办法:如果只有在修改事务完全提交之后才可以读取数据,则可以避免

        (4)幻读:两次执行同一条select语句会出现不同的结果,第二次会增加一条数据行

        解决办法:如果在操作事务完成数据处理之前,任何其他事务不可以添加新数据,则可以避免该问题

*数据库的隔离级别:(四种)

(1)读未提交(read_uncommited):事务对当前读取的数据不加锁;事务在更新某数据的瞬间,必须先对其加行级共享锁,直到事务结束才释放;

具体表现:两个事务不可以同时进行更新操作,但是一个事务读的时候,另一个事务可以进行读取,修改操作,即使未提交,也可以被其他事务读取

(2)读已提交(read_commited):事务对当前被读取的数据加行级共享锁(当读到时才加锁),一旦读完该行,立即释放该行级共享锁;事务在更新某数据的瞬间,必须先对其加行级排它锁,直至事务结束后才释放

具体表现:两个事务可同时进行读操作,但是当一个事务进行更新操作时,另外一个事务不能够进行更新操作,直至事务1结束,事务2对该记录进行更新时,事务1再次读取该记录,读到的是事务2对其进行更新前的版本

(3)可重复读(Repeatable read):事务在读取某数据的瞬间(即开始读取的瞬间),必须现对其加行级共享锁,直到事务结束才释放;事务在更新数据的瞬间(就是发生更新的瞬间),必须先对其加行排它锁,直到事务结束才释放

具体表现:两个事务可同时进行读操作,但是当一个事务进行更新操作时,另外一个事务不能够进行更新操作,直至事务1结束;当事务2对该数据进行更新时,事务1再次读取该记录,读到的任然是第一次读取的那个版本

(4)可序列化(Serializable):事务在读取数据时,必须先对其加表级共享锁,直到事务结束才释放;事务在更新数据时,必须先对其加表级排它锁,直到事务结束才释放

*数据库中的悲观锁和乐观锁

        (1)悲观锁:需要关闭数据库的自动提交设置,悲观锁需要指明主键或索引(这时会对行加锁),否则会对表加锁

        (2)①使用版本号②使用时间戳(实现原理在表中添加一个时间字段)

*数据库中的锁:

(1)按操作划分,可分为DML锁、DDL锁

(2)按锁的粒度划分,可分为表级锁、行级锁、页级锁(mysql)

(3)按锁级别划分,可分为共享锁、排他锁

(4)按加锁方式划分,可分为自动锁、显示锁

(5)按使用方式划分,可分为乐观锁、悲观锁

*数据库的范式:

       第1范式:每个表中都有1列,并且该列是不可拆分的最小单元

第2范式:要求表中所有的列,都必须依赖于主键,不存在部分依赖问题

第3范式:要求表中每一列只与主键直接相关而不是间接,不存在传递依赖

*数据库五大约束:

        1.primary KEY:设置主键约束;

2.UNIQUE:设置唯一性约束,不能有重复值;

3.DEFAULT 默认值约束,height DOUBLE(3,2)DEFAULT 1.2 height不输入是默认为1,2

4.NOT NULL:设置非空约束,该字段不能为空;

5.FOREIGN key :设置外键约束。

*关系型数据库:

        **关系型数据库是依据关系模式来创建的数据库(一对一,一对多,多对多等关系模式)

常见关系型数据库:Oracle、DB2、PostgreSQL、Microsoft SQL Server、Microsoft Access、MySQL

**关系型数据库的特点:

(1)安全(因为存储在磁盘中,不会说突然断电数据就没有了)、

(2)容易理解(建立在关系模型上)、

(3)但不节省空间(因为建立在关系模型上,就要遵循某些规则,好比数据中某字段值即使为空仍要分配空间)

*非关系型数据库:

        **非关系型模式有:

  1. 列模式:存储的数据是一列列的
  2. 键值对模型:存储的数据是一个个的“键值对”
  3. 文档型模式:以一个个文档来存储数据,有点类似“键值对”

**常见的非关系型数据库:

      1. 列模型:Hbase
      2. 键值对模型:redis,MemcacheDB
      3. 文档类模型:mongoDB       

**非关系型数据库的特点:

  1. 效率高(因为存储在内存中)、
  2. 但不安全(断电丢失数据,但其中redis可以同步数据到磁盘中),现在很多非关系型数据库都开始支持转存到磁盘中

*三种数据库的比较:

(1)Sql server::

优点:易上手,真正的客户机/服务器体系,图形化用户界面,大多数建立在windows平台上,是学习其他数据库的基础,兼容性良好,提供数据库仓库功能

缺点:只能在windows上运行,没有丝毫开放性,安全性和伸缩性有限,不是免费的,数据不容易恢复

(2)Mysql

        优点:是一个快速/多线程/多用户的SQL数据库服务器,免费的,支持正版SQL查询语言和采用多种数据类型,能够对数据进行各种查询,稳定且易扩展

        缺点:比较难学,不支持陌生关键字,缺乏一些存储程序的功能

(3)Orace:

        优点:能在所有主流平台上运行,采用完全开放原则,安全性高,性能高,采用标准的sql语句进行查询,备份恢复原理明了

        缺点:不易维护,数据奔溃难处理,因为大多存储在内存里,数据库连接较慢,对硬件要求较高,价格昂贵

猜你喜欢

转载自blog.csdn.net/sinat_36722750/article/details/82821791