【数据库基础】

可重复读可以确保同一个事务,在多次读取同样的数据的时候,得到同样的结果。可重复读解决了脏读的问题,不过理论上,这会导致另一个棘手的问题:幻读( PhantomRead )。MySQL数据库中的InnoDB和Falcon存储引擎通过MVCC(Multi- VersionConcurrentControl ,多版本并发控制)机制解决了该问题。需要注意的是,多版本只是解决不可重复读问题,而加上间隙锁(也就是它这里所谓的并发控制)才解决了幻读问题。在该隔离级别,所有事务都可以看到其他未提交事务的执行结果,即在未提交读级别,事务中的修改,即使没有提交,对其他事务也都是可见的,该隔离级别很少用于实际应用。读取未提交的数据,也被称之为脏读(Dirty Read)。该隔离级别最低,并发性能最高。 数据库基础

一、数据库分类

数据库可按照存储模型、关系型/非关系型进行分类

1.1、存储模型:

  1. 网状数据库 :是指处理以记录类型为结点的网状数据模型的数据库,将网状结构分解为若干二级树,其代表是DBTG系统。
  2. 关系型数据库 :关系型数据库是将数据组织为相关行和列的系统,**关系型数据库管理系统(RDBMS)**通过数据、关系和对数据的约束三者组成的数据模型来存放和管理数据。
  3. 层次数据库 :也叫树状数据库,是将数据组织成有向有序的树结构,并用“一对多”关系联结不同层次的数据库,代表是IMS数据库。

1.2、关系/非关系型

1.2.1 关系型数据库(RDBMS)

RDBMS的特点:

  • 数据以表格的形式出现;
  • 每行存储着一条单独的记录;
  • 每个列作为一条记录的一个属性存在;
  • 许多行和列组成一张表
  • 若干表组成数据库
1.2.1.1 按是否存在内存分:
  1. 内存数据库:将数据存放在内存中直接操作的数据库,数据读写速度快;如 SQLite、TimesTen。
  2. 非内存数据库:如Oracle、MySQL、SQLServer、DB2、PostgreSQL、Access、Informix等。
1.2.1.2 按照大小分:

小型数据库:Access、foxbase、SQLite

中型数据库:MySQL、SQL Server、Informix

大型数据库:Oracle、DB2

1.2.2 非关系型数据库(NoSQL)

NoSQL泛指非关系型数据库;NoSQL的产生是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。

NoSQL数据库大约可分为四大分类:键值数据库、列存储数据库、文档型数据库和图形数据库。

键值数据库:如Redis、LevelDB、RocksDB、Riak KV、Oracle Berkeley DB 、Memcached等

列存储数据库:通常用来应对分布式存储法海量数据。常见数据库:HBase、CAssandra、Accumulo、HyperTable等

文档型数据库:如MongoDB、CouchDB

图形数据库:如Neo4j、InfoGrid、InfiniteGraph、Titan、Girap等。

二、事务

概念:事务(Transaction)是一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。事务通常以

BEGIN TRANSACTION 开始,以COMMIT或者 ROLLBACK操作结束,COMMIT即提交,提交事务中的所有的操作、事务正常结束。ROLLBACK即回滚,撤销已经的所有操作。事务是数据库系统区别于系统的重要特性之一。

2.1事务的4个特性,也称之为ACID特性:

  • 原子性(Atomicity):指事务在逻辑上是一个不可分割的操作单元,其所有语句要么都执行,要么都撤销执行。
  • 一致性(Consistency):指事务在开始前和结束后,数据库的数据是完整的。
  • 隔离性(Isolation):隔离性是针对并发事务而言,同一时刻只允许一个事务请求同一个数据,不同事务之间彼此没有任何干扰。
  • 持久性(Durability):事务的持久性也叫永久性,是指数据一旦提交修改成功后,其对数据的修改是持久的,不可回滚

2.2 事务的4中隔离级别:

2.2.1 事务并发执行造成的问题:
  • 脏读(Dirty Read):事务A读取了事务B更新的数据,但事务B并没有提交,操作回进行回滚,那么事务A读取的数据就是脏数据。
  • 不可重复读(Nonrepeatable Read):事务A多次多次读取同一个数据,事务B在事务A多次读取的过程中对数据进行了更新提交,那么导致事务A前后读取的数据不一致。
  • 幻读(Phantom Read):事务A对数据库中某个数据执行了‘a’修改为’b’的操作,而这时事务B又插入了一行数值为‘a’的数据并且提交给了数据库。当事务A结束后进行查看,就会发现还有一条数据没有修过来。

不可重复读是由于事务并发修改同一记录导致,要避免这种现象,最简单的方法就是对要修改的记录加锁,但这会导致锁竞争加剧,影响性能,另一种方法就是通过MVCC可以在无所的情况避免不可重复读。

幻读是由于并发事务增加记录导致,无法进行加锁解决,需要将事务串行化才能避免。

2.2.2 事务的隔离等级
隔离级别ReadUncommitted(未提交读,读取未提交内容)ReadCommitted(提交读,读取提交的内容Repeatable Read(可重复读)Serializable(可串行化、可序列化)
简介在该隔离级别,所有事务都可以看到其他未提交事务的执行结果,即在未提交读级别,事务中的修改,即使没有提交,对其他事务也都是可见的,该隔离级别很少用于实际应用。读取未提交的数据,也被称之为脏读(Dirty Read)。该隔离级别最低,并发性能最高。这是大多数数据库系统的默认隔离级别。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。换句话说,一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的可重复读可以确保同一个事务,在多次读取同样的数据的时候,得到同样的结果。可重复读解决了脏读的问题,不过理论上,这会导致另一个棘手的问题:幻读。MySQL数据库中的InnoDB和Falcon存储引擎通过MVCC(多版本并发控制)机制解决了该问题。需要注意的是,多版本只是解决不可重复读问题,而加上间隙锁(也就是它这里所谓的并发控制)才解决了幻读问题。是MySQL的默认隔离级别这是最高的隔离级别,它通过强制事务排序,强制事务串行执行,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。实际应用中也很少用到这个隔离级别,只有在非常需要确保数据的一致性而且可以接受没有并发的情况下,才考虑用该级别。这是花费代价最高但是最可靠的事务隔离级别。
脏读允许
不可重复读允许允许
允许允许允许
Oracle、SQL ServerMySQL
并发性能最高比未提交读低比提交读低最低
2.2.3 Oracle、MySQL和SQL Server中的事务隔离级别

1、Oracle数据库:支持 Read Committed(提交读)和Serializable(可串行化),默认隔离级别为Read Committed(提交读)

Oracle数据库不支持脏读。

Oracle设置隔离级别的语句:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;#提交读
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;#可串行化,不支持SYS用户/2、

2、MySQL数据库:支持四种隔离级别,默认隔离级别为Repeatable Read(可重复读)

MySQL设置隔离级别语句:GLOBAL表示系统级别,SESSION表示会话级别。

SET GLOBAL|SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; #未提交读
SET GLOBAL|SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; #提交读
SET GLOBAL|SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ ; #可重复读
SET GLOBAL|SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE; #可序列化、可串行化

MySQL查询隔离级别语句:

#查询当前会话的事务隔离级别
SELECT @@TX_ISOLATION;
#查询系统事务隔离级别
SELECT @@GLOBAL.TX_ISOLATION;
#同时查询当前会话和系统事务隔离级别
SELECT @@GLOBAL.TX_ISOLATION,@@TX_ISOLATION

3、SQL Server数据库:支持四种隔离级别,默认隔离级别为Read Committed(提交读)。

三、MySQL的存储引擎:

3.1存储引擎比较

下述存储引擎是最常用的:

  • MyISAM:默认的MySQL插件式存储引擎,它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。注意,通过更改STORAGE_ENGINE配置变量,能够方便地更改MySQL服务器的默认存储引擎。

  • InnoDB:用于事务处理应用程序,具有众多特性,包括ACID事务支持。

  • BDB:可替代InnoDB的事务引擎,支持COMMIT、ROLLBACK和其他事务特性。

  • Memory:将所有数据保存在RAM中,在需要快速查找引用和其他类似数据的环境下,可提供极快的访问。

  • Merge:允许MySQL DBA或开发人员将一系列等同的MyISAM表以逻辑方式组合在一起,并作为1个对象引用它们。对于诸如数据仓储等VLDB环境十分适合。

  • Archive:为大量很少引用的历史、归档、或安全审计信息的存储和检索提供了完美的解决方案。

  • Federated:能够将多个分离的MySQL服务器链接起来,从多个物理服务器创建一个逻辑数据库。十分适合于分布式环境或数据集市环境。

  • Cluster/NDB:MySQL的簇式数据库引擎,尤其适合于具有高性能查找要求的应用程序,这类查找需求还要求具有最高的正常工作时间和可用性。

  • Other:其他存储引擎包括CSV(引用由逗号隔开的用作数据库表的文件),Blackhole(用于临时禁止对数据库的应用程序输入),以及Example引擎(可为快速创建定制的插件式存储引擎提供帮助)。

请记住,对于整个服务器或方案,你并不一定要使用相同的存储引擎,你可以为方案中的每个表使用不同的存储引擎,这点很重要。

下述存储引擎支持事务:

  • InnoDB:通过MVCC支持事务,允许COMMIT、ROLLBACK和保存点。

  • NDB:通过MVCC支持事务,允许COMMIT和ROLLBACK。

  • BDB:支持事务,允许COMMIT和ROLLBACK。

3.2将存储引擎指定给表

创建表时指定存储引擎,可使用ENGINE参数:

CREATE TABLE students(
id int,
name char
) ENGINE = InnoDB;

更改已有表的存储引擎,可使用ALTER TABLE语句:

ALTER TABLE students ENGINE = MyISAM;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一枚小白猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值