1、什么是事务,它的特性是什么?
事务是指作为单个逻辑工作单元的一系列操作(一系列SQL语句)。当多个事务并发地存取数据库时就会产生同时读取和/或修改同一数据的情况。若对并发操作不加控制就可能会存取和存储不正确的数据(脏读、非重复读、幻像读、丢失修改的异常情况),破坏数据库的一致性。
“A向B支付50”
-
读出A支付宝余额(100)。
-
A支付宝扣钱操作(100-50)。
-
结果写回A账号(50)。
-
读出B支付宝余额(100)。
-
B支付宝做加法操作(100+50)。
-
结果写回B支付宝(150)。
事务的四个特性:
原子性:事务必须是原子工作单位。对于数据的修改,要么全部执行,要么全部不执行。以上六个步骤,要么都执行,要么都不执行;
一致性:事务在完成时,所有的数据必须保持一致状态。比如:A转支付前(100)+B收款前(100)=A支付完成后(50)+B收款后(150);
隔离性:并发事务对数据的修改于其他并发事务对数据的修改是隔离的。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。比如:在A向B转账的整个过程中,只要事务还没有提交(commit),查询A账户和B账户的时候,两个账户里面的钱的数量都不会有变化。
持久性:事务完成后,对系统的影响是永久的。一旦转账成功,变化就真实存在了。
2、什么是死锁。产生死锁的原因,避免死锁的方法。
MySQL有三种锁的级别:页级、表级、行级。
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般
死锁就是两个或多个事务在同一个资源上相互占用,并且请求锁死对方的资源。
避免死锁的方法:一个事物经量一次锁定所用资源;表级锁;并发存取多个表时,以相同顺序访问。
3、索引
索引就是对表格一列或者多列进行排序的一种结构
索引类型:
主键索引(PRIMARY KEY,每张数据表只能存一个主键);
唯一索引(UNIQUE KEY,可以保证记录的唯一性);
普通索引(INDEX);
全文索引(FULLTEXT)。
最左前缀(最左优先):where 子句使用最频繁的一列放在最左边
常见索引算法:BTree(用在>、<、>=等比较操作符),Hash(用在=对等比较符)。且Hash索引检索比BTree索引检索效率高。
索引设计:适用于索引的列出现在where子句中的列;用短索引;不要过度使用索引。
优点:可以实现快速查询;
缺点:降低更新表的速度;建立索引会占用磁盘空间的索引文件。
4、脏读,不可重复读,幻读
脏读:A事务读取了B事务更新的数据,但是B回滚了,那么A就是脏读。
不可重复读:A事务重复读取同一数据多次,在A事务读取的过程中,B事务对该数据进行更新并提交,导致A事务读取的数据不一致。
幻读:A事务对表格进行整体优化(评等级),B事务在A事务优化过程中插入一行新的记录,导致A事务完成后发现还有记录没有优化完成,就好像发生幻觉一样。
5、sql生命周期
- 客户端服务器和数据库服务器创建连接
- 数据库进程拿到请求sql
- 解析并生成执行计划并执行
- 读书数据放入内存中并进行逻辑处理
- 发送结果给客户端服务器
- 关闭连接,释放资源