(以下为复习完一部分资料后又写了一遍,为了加深印象)
一、非关系型数据库和关系型数据库区别,优势比较
非关系型数据库:
称为:NoSQL,也就是not only sql 意味不仅仅是SQL。非关系型数据库不需要写一些较为复杂得SQL语句,其内部得存储方法是以key-value得形式。常见得非关系型数据库有Hbase、Redis、MongoDB等。非关系型数据库不需要经过SQL得重重解析,所以性能很高;非关系型数据库得可扩展性比较强,数据之间没有耦合性,遇见需要添加得字段,就直接增加一个key-value得键值对就行了。
关系型数据库:
以表格得形式存在,以行和列得形式存取数据,关系型数据库得这一系列得列和行被称之为表,无数张表组成了数据库,常见得关系型数据库有Oracle,DB2,Microsoft SQL Server,MySQL等。关系型数据库能够支持较为复杂得SQL查询,能够体现出数据之间、表之间得关联关系;关系型数据库也支持事务,便于提交和回滚。
二、MySQL事务四大特性
首先什么是MySQL的事务:事务是一组操作,组成这组操作的各个单元,原子性中的要么全部成功要么全部失败,这个特性就是事务。在MySQL中,事务是在引擎层实现的,只有使用innodb引擎的数据库或表才支持事务。
1.原子性:事务得操作要么全部成功,要么全部失败回滚。因此成功就必须全部应用到数据库,操作失败则对数据库不能有任何影响。
2.一致性:一致性指得是一个事务在执行的前后其状态一致。例如:A和B加起来的钱一共1000元,那么无论她们中间如何转账,转了多少次,事务结束后两个用户的钱加起来还是1000元,这就是事务的一致性。
3.持久性:指的是事务一旦提交回滚,那么发生的改变就会是永久性的,即使数据库遇到特殊情况也不会产生干扰。
4.隔离性:当多个事务同时进行的时就有可能出现脏读、不可重复读、幻读的情况,为了解决这些并发问题,提出了隔离性的概念。
脏读:当事务A读取了事务B的数据,事务B没有提交,然后事务B执行了回滚操作,这时候事务A读取到的数据就是脏读;
不可重复读:事务A进行多次的数据读取操作,事务B在事务A读取的过程中进行更新数据并提交,事务A读取到的数据不一致;
幻读:事务A在数据库中将所有学生的成绩A-B(例如排序),这个时候事务B手动插入了一条成绩为A的数据,事务A更新数据完毕发现多了一条没有修改的数据,这个情况就是出现了幻读。
SQL的隔离级别有四种:
读未提交:指得是一个事务在提交之前,所做的修改就能够被其他事务看到。
读已提交:指的是一个事务在提交之后,所做的修改才能够被其他事务看到。
可重复读:指得是一个事务在执行的过程中,看到的数据和启动时看到的数据是一致的。未提交的变更对其他事务不可见。
串行化:指得是会对于同一行记录,写会加写锁,读会加读锁。当出现读写锁冲突的时候,后访问的事务必须等待前一个事务执行完毕,才能继续执行。
这四个隔离级别可以解决脏读、不可重复读、幻读这三类问题
级别由低到高是:读未提交 < 读已提交 < 可重复读 < 串行化
注意:大部分的隔离级别越高,越能够保证数据的完整性和一致性,但是对并发的性能影响越大。大多数数据库的默认级别是读已提交,比如Sql Server 、Oracle,但是MySQL的默认隔离级别是可重复读。