数据库——总结(1)

来源:互联网 发布:阿里云如何建网站 编辑:程序博客网 时间:2024/06/06 18:22

总结数据库锁和优化知识


1.数据库锁机制:用来保证并发下,事务的隔离性和数据的正确性。

按细粒度划分:可分为表级锁、行级锁、页级锁(MySQL)
按锁级别划分,可分为共享锁、排他锁
按使用方式划分,可分为乐观锁、悲观锁

1)表级锁就是锁住表
2)行级锁就是锁住数据行(mysql通过索引锁住行,oracle通过数据行)
3)页级锁就是锁住一组相邻的数据

4)共享锁:就是某个事务对某个数据加上这个锁,只能对数据进行读取,同时其他事务也能对这个数据进行读取,所有事务都不能修改
5)排它锁:就是某个事务对某个数据加上这个锁,既可以修改也可以读取,其他事务不能读取也不能修改

6)乐观锁:就是各个事务处理数据互不影响,等提交时,会检查数据有没有被修改过,若没修改过,则提交,若修改过,则通知用户让用户来决定如何处理
7)悲观锁:就是认为各个事务处理数据会相互影响,所以必须给数据加个锁,其他事务不能对我的数据进行一些操作

2.数据库引擎:不同的引擎会对数据库有不同的作用和设置,提供不同的功能。
mysql的引擎:ISAM、MyISAM、HEAP(也称为MEMORY)、CSV、BLACKHOLE、ARCHIVE、PERFORMANCE_SCHEMA、InnoDB、 Berkeley、Merge、Federated和Cluster/NDB等

其中InnoDB支持行锁,当事务不是通过索引访问数据,则加锁为页级锁。所以支持不代表一定使用这个锁

3.事务
1)事务的特性(ACID):原子性,一致性,隔离性,持久性
2)读取数据有三种情况:脏读,不可重复读,幻读
3)事务隔离级别:Read uncommitted,Read committed ,Repeatable read,Serializable
                  √: 可能出现    ×: 不会出现
            级别                脏读 不可重复读幻读
Read uncommitted
Read committed       ×
Repeatable read       ××
Serializable       ×××



************************
针对数据库系统概论书本上的知识:

1.数据库优化
1)sql语句的优化:代数优化,物理优化。这两个优化是数据库管理系统自动帮我们优化。但是对于sqlite这样的数据库,需要自己对sql语句进行优化
代数优化:1.对关系代数表达式进行等价交换,如连接,笛卡尔积的交换律 2.利用启发式规则,如选择运算尽可能先做
物理优化:1.启发式优化,(1)选择不同路径操作。如直接全表查询,还是通过索引找到指针,再根据指针从全表找到数据
(2)选择不同算法,如嵌套循环还是排序-合并
 2.代价估算。根据数据字典估算代价。如计算每种索引的代价,选择最小代价的索引操作
2)带宽增大,利用更好的网络,降低延迟和阻塞几率
3)硬件主机配置提高

2.并发操作导致的数据不一致情况:丢失修改,不可重复读,读脏数据

3.封锁(加锁)
1)锁类型:排他锁(X锁),共享锁(S锁)
2)封锁协议:类似于事务隔离级别,但是他们不一样。
三级封锁协议,其实通过X,S锁的概念,即实现了这三级封锁协议
3)活锁:没有发生死锁,但由于调度的选择,导致某个事务一直等待下去。通过先来先服务策略可避免。
死锁:事务之间相互请求对方已经加的锁,导致的情况。
死锁预防:一次封锁法,顺序封锁法。
死锁诊断与解除(数据库普通使用的解除死锁的方法):超时法,等待图法(图的应用)。

4.并发调用的可串行行
尽管利用封锁协议执行,解决并发,但是结果并不一定是正确的。若并发的事务最终的结果与串行执行结果一趟,则认为是可串行的,即是正确的。
1)冲突可串行化:一个调度序列在保证不改变冲突操作的次序,改变不冲突操作的次序,得到另一个调度序列,若这个序列是串行的,则称这个调度序列是冲突可串行的。

5.两段锁:第一阶段只能加锁,第二阶段只能解锁。遵守两段锁必定是可串行化的,即是正确的

6.封锁粒度:封锁对象的大小。
1)多粒度封锁:一个系统同时支持多种封锁粒度供不同事务选择。
多粒度封锁首先构造一个多粒度树,如此就会有显示封锁,隐式封锁。
显示封锁:事务直接加到对象上的锁
隐式封锁:多粒度树上级对象加锁,对应的下级对象自动加了锁。

2)意向锁:用来表明一个对象加意向锁,这个对象下级对象正在被加锁。
分类:意向共享锁(IS),意向排他锁(IX),共享意向排它锁(SIX)

7.其他并发控制机制:时间戳,乐观控制法(就是乐观锁),多版本并发。