事务
是一个操作序列,是并发控制的基本单位,为了维护数据库的完整性。比如说删除一个人员,要同时删除他的基本资料,还有相关信息,如文章,信箱等,这一系列语句构成事务。
-
基本特征:ACID
A:Atomicity 原子性, 一组事务,要么成功,要么撤回。
C:Consistency 稳定性, 有非法数据(外键约束之类),撤回事务。
I:Isolation 隔离性, 事务独立运行(100%隔离,牺牲速度),一旦一个事务运行后果影响其他事务,那么其他事务将撤回。
D:Durability 可靠性,一旦软硬件崩溃,可以从日志中恢复(持久化)。
脏读,不可重复读,幻读
- 脏读:一个事务读取了另一个事务未提交的数据,该事务可能回滚。
- 不可重复读:一个事务多次读取某数据,在该事务提交前,另一个事务访问了该数据(可能修改数据)。
- 幻读:事务不独立执行。比如事务1对表中数据进行修改的同时事务2向表中插入数据。
redo/undo log
- undo log:数据修改前旧数据的备份,保证事务原子性。
- redo log:事务提交前新数据的备份,保证事务持久性。
若数据库宕机时事务已提交,对比redo log,若未提交,对比undo log。
锁类别
乐观锁:别人的每个举动都觉得他会只读,更新时才加锁判断(像github)
悲观锁:别人的每个举动都觉得他要修改,先加锁。
表锁(表级锁:一次性锁定事务涉及到的表):
开销少,加锁快,锁定粒度大,锁冲突概率高,并发度低,不会出现死锁。
行锁:开销大,加锁慢,锁定粒度小,锁冲突概率低,并发度高,会出现死锁。
页锁:性能介于表锁和行锁之间,会出现死锁。
死锁:两个事务之间互有冲突,导致都锁住,无法完成。
索引
- 分类:
- 唯一索引:不允许任何两行具有相同索引。
- 主键索引:主键作为索引。
- 聚集索引:聚集索引是指数据库表行中数据的物理顺序与键值的逻辑(索引)顺序相同。一个表只能有一个聚集索引。
- 缺点:增加了数据的存储空间,增加和修改数据时花费时间变长。
- 修改性能和检索性能是相互矛盾的。