1.1.数据库的存储引擎
数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。
mysql默认的是InnoDB。
1.2.事务
1.2.1.什么是事务?他有什么特性
什么是事务
事务是指数据库中一个用户操作的可执行的单元,这个操作要么都成功要么都失败,是不可分割的
例如:当你给别人转账时当你的账户扣钱成功,别人的账户也要收钱成功,这才完成一次转账。这两个是同时进行的要么全部成功,要么全部失败。
原子性:事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据改操作要全部执行,要么全部不执行。这种特性称为原子性
一致性: 指在一个事务执行之前和执行之后数据库都必须处于一致性状态。这种特性称为事务的一致性。假如数据库的状态满足所有的完整性约束,就说该数据库是一致的。他分为两种: 1.数据库本身的一致性(比如主键不能为空) 2.我们规定的一致性
隔离性: 事务之间应该是相互隔离。互不干扰
持久性:一旦被提交到磁盘里的事务就不可改变。
可以说,一致性是最重要的,其他的特性基本都是为了保证一致性所独立的。
注意:当数据被回滚或者提交就代表一段事务已经被执行了
而我的数据库是默认将内存里的事务提交到磁盘里的,可以用 autocommit =on来调节。
所以在没调节的情况下:
select * from student where 1=1
实际上已经算是执行了一个事务
事务的手动开启 :begin
事务的结束:rollback
和 commit
1.2.2.事务并发带来的读一致性的三大问题
脏读
脏读指的是某事物没有提交到磁盘,使得其他事务读取到了内存里的数据与磁盘的数据不统一,引起的数据变化问题。
不可重复读
不可重复读指的是某行数据被事务一访问,然后其他事务又对他进行更新和删除操作,并且提交。事务一又进行访问,引起的访问结果不一致问题。
幻读
幻读指的是某行数据被事务一访问,然后其他事务又对他进行插入操作,并且提交。事务一又进行访问,引起的访问结果不一致问题。
为了解决这些问题,我们需要将事务隔离,SQL92已经规定了几个隔离级别标准(ANSI/ISO标准)。其中innoDB用的是第三个隔离级别,保证了上述三种一致性问题不会出现。
mysql默认使用的InnoDB引擎对事务隔离级别的实现
那么,这些隔离级别具体是怎么实现的呢?
有以下几种方法
- 加锁(lbcc)
- 快照机制(mvcc):
- InnoDB Locking
1.2.3.事务锁的介绍(InnoDB Locking)
InnoDB提供的锁及其算法
按照锁的粒度分
如果你想给一个表加一个表锁,那么必然没有其他事务锁定这张表的任意一个数据。
问题:MylSAM和InnoDB分别支持什么粒度的锁? 前者表锁,后者行锁和表锁。
- 行锁
行锁有两种基本形式:
- 表锁
意向锁其实是一种标志,他是数据库自己加的,用来证明这个表里某行已经加锁了。使得我们不用一行行确认,提高了效率。
写到这里,锁的多种多样令我们惊叹,也不禁思考起来—锁究竟锁住了什么呢?
经过一番尝试,我们发现:
锁锁住了索引,锁锁住的索引分为三级:
- 主键索引(primary key)
- 唯一索引(unique key no null)
- 不使用索引(_rowid)
一个表如果没有主键索引和唯一索引,锁就会锁最后一个_rowid索引,而这种情况会锁定全表导致此时锁住一行就锁柱这个表。
其实数据一般由主键索引存储,其他索引想找到这个数据也要通过主键索引。
1.2.4.索引
聚集索引和二级索引
聚集索引指的是优先级最高的索引,一个表一定会有聚集索引。而二级索引指的就是我们后来在聚集索引已经确认的情况下加的优先级略低于聚集索引的索引。
- 主键索引(primary key)
- 唯一索引(unique key no null)
- 不使用索引(_rowid)