事务
1.概念
事务是用户定义的一个数据库操作序列,这些操作要么全做,要么不做。在关系数据库中,一个事务是一条SQL语句、一组SQL语句或者整个程序。
2.ACID特性
事务具有以下4个特性:
- 原子性:一个事务中的所有操作,要么全部完成,要么全部不做。
- 一致性:在事务开始之前或者完成之后,数据库的完整性都没有被破坏。如果事务被迫中断,逻辑上就会发生错误,数据库就处于不一致状态。
- 隔离性:防止多个事务并发执行由于交叉执行导致数据不一致。
- 持久性:事务一旦提交,他对数据库的改变应该是永久性的,即使系统故障也不会丢失。
3.MySQL事务
MySQL命令行默认自动提交事务,显式开启事务使用BEGIN或者START TRANSACTION或者执行SET AUTOCOMMIT=0禁止当前会话的自动提交。
事务控制语句有:
- BEGIN或者START TRANSACTION:显式开启一个事务
- COMMIT:提交事务到数据库
- ROLLBACK:结束用户的事务,并撤销正在进行的所有未提交的修改
数据库恢复
1.故障分类
数据库系统可能会发生各种故障;
- 事务内部故障
- 系统故障
- 介质故障
- 计算机病毒
2.恢复技术
- 数据转储
- 登记日志文件
数据库并发控制
为了保证事务的隔离性和一致性,数据库管理系统需要对并发操作进行正确的调度。
1.数据不一致性
- 丢失修改:两个事务修改同一数据,其中一个事务破坏了另一个事务的修改。
- 不可重复读:一个事务读取数据,另一个事务更新数据,导致第一个事务无法再现前一次读的数据。
- 读脏数据:一个事务修改数据并写回磁盘,另一个事务读取数据;第一个事务由于其他原因被撤销,导致第二个事务读到的数据与数据库中的数据不一致。
产生上述不一致性的原因是并发操作破坏了事务的隔离性,并发控制就是为了保证隔离性,从而避免数据的不一致性。
2.并发控制技术
主要技术有:
- 封锁
- 时间戳
- 乐观控制法
- 多版本并发控制
这里主要解释封锁技术,基本的封锁分为排他锁(写锁、X锁)和共享锁(读锁、S锁)。封锁协议如下:
- 一级封锁协议
- 事务在修改数据前必须先加X锁,直到事务结束(COMMIT或者ROLLBACK)才释放。
- 防止丢失修改
- 二级封锁协议
- 在一级封锁协议的基础上增加事务读取数据前先加S锁,读完立即释放S锁。
- 防止丢失修改,防止读脏数据
- 三级封锁协议
- 在一级封锁协议的基础上增加事务读取数据前先加S锁,直到事务结束才释放。
- 防止丢失修改,防止读脏数据,防止不可重复读
数据库的锁机制
推荐文章:https://www.cnblogs.com/ggjucheng/archive/2012/11/14/2770445.html#top
为了保证数据库的完整性和一致性,数据库系统采用锁来实现事务的隔离性。
根据锁的对象分为表级锁(并发少,以查询为主)和行级锁(并发高)。根据锁的类型分为以下几种:
1.悲观锁
悲观地认为并发总会产生问题,所以在事务开始读取数据时就对数据加锁,直到事务提交或者回滚才允许其他事务读取数据。
- 共享锁
- 用于读取数据,允许其他事务读取它锁定地资源,但是不允许其他事务修改
- 事务执行select语句时,使用共享锁锁定要查询的数据
- 具有良好的并发性能,数据被加共享锁后,还可以加共享锁或更新锁
- 独占锁
- 用于修改数据,不允许其他事务读取或者修改它锁定的资源
- 事务执行insert、update、delete语句时,使用独占锁锁定数据
- 并发性能差,只能允许一个事务进行读取和修改,其他事务需要等待该事务结束才能加其他锁
- 更新锁
- 用于锁定将要被修改的数据
- 事务执行update语句时,数据库系统先分配更新锁,读取完数据后再升级为独占锁进行修改。(如果先分配共享锁,读取完再升级为独占锁,有可能产生死锁 -> 两个事务都等待另一个事务释放共享锁)
- 允许在更新锁上加共享锁,但是一个资源最多加一个更新锁,然后升级为独占锁,避免死锁
2.乐观锁
乐观地认为并发不一定会产生问题,所以在事务处理完数据提交时才检查数据是否被修改过,如果修改过,则更新失败。
乐观锁与数据库锁机制无关,其实现策略为:
- 设置版本字段:事务更新后其值加一,每当事务提交时检查其值与更新前是否一致
- 添加时间戳字段(timestamp类型):每当事务提交时检查和更新前的时间戳是否一致
数据库索引
1.索引实现原理
- 数据库索引是数据库管理系统中的一个排序的数据结构(通常是B树或者B+树),以实现快速查找数据。
- 在表的某一列上创建索引,即将这一列的数据复制出来,生成非聚集索引(平衡树)。当按某个值查找时,先从非聚集索引中查找此值对应的主键,然后在按照主键值在聚集索引中查找数据。(或者在复合索引中直接查找到需要的数据)
- 在表中添加主键,则表在磁盘中的存储结构由整齐排列变为平衡树结构,整个表也就变成了聚集索引。所以一个表只能有一个主键,一个聚集索引。
2.设置索引代价
设置索引会占用物理空间,在插入和修改数据时维护索引也需要花费较多时间。