数据库相关知识整理(三)

数据库事务

MySQL的事务

start transaction;
……  #一条或多条sql语句
commit;

其中start transaction标识事务开始,commit提交事务,将执行结果写入到数据库。如果sql语句执行出现问题,会调用rollback,回滚所有已经执行成功的sql语句。当然,也可以在事务中直接使用rollback语句进行回滚。 

四个特性ACID

事务(Transaction)是由一系列对系统中数据进行访问与更新的操作所组成的一个程序执行逻辑单元。事务是DBMS中最基础的单位,事务不可分割。

事务具有4个基本特征,分别是:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Duration),简称ACID。

事务:是一系列的数据库操作,是数据库应用的基本逻辑单位。
事务特性:
1)原子性:事务被视为不可分割的最小单元,事物的所有操作要不成功,要不失败回滚,而回滚可以通过日志来实现,日志记录着事务所执行的修改操作,在回滚时反向执行这些修改操作。

2)一致性:数据库在事务执行前后都保持一致性状态,在一致性状态下,应用系统从一个正确的状态到另一个正确的状态。

关于一致性 https://www.zhihu.com/question/31346392

3)隔离性:一个事务所做的修改在最终提交以前,对其他事务是可不见的。

4)持久性:一旦事务提交,则其所做的修改将会永远保存到数据库中。

事务的隔离级别

脏读:脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。
不可重复读:不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
幻读:幻读是 A 事务读取到 B 事务提交的新增数据,这时 A 事务将出现幻象读的问题。
幻读和不可重复读是两个容易混淆的概念,前者是指读到了其他已经提交事务的新增数据,而后者是指读到了已经提交了事务的更改数据(更改或删除)。为了避免这种情况,采取的对策不相同:防止读到更改数据,只需要对操作的数据添加行级锁,阻止操作中的数据发生变化;而防止读到新增数据,则往往需要添加表级锁——将整张表锁定,防止新增数据。


Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
Repeatable read (可重复读):可避免脏读、不可重复读的发生。
Read committed (读已提交):可避免脏读的发生。
Read uncommitted (读未提交):最低级别,任何情况都无法保证。

悲观锁:也即悲观并发控制,Pessimistic Concurrency Controller,缩写 PCC。悲观锁是指在数据处理过程,使数据处于锁定状态,一般使用数据库的锁机制实现。
悲观锁优缺点:悲观并发控制(悲观锁)采用"先取锁再分"的保守策略,为数据处理提供了安全的保证。但在效率方面,加锁机制会产生额外的开销,增加产生死锁的机会。
乐观锁:相对悲观锁来说,乐观锁是通过记录数据版本的方式实现乐观锁。为数据增加一个版本标识,读取数据时,将版本标识一起读出,数据没更新一次,就对版本标识进行更新。

乐观锁优缺点:乐观锁认为事务直接竞争的概率是很小的,在提交的时候才锁定,所以不会产生死锁。但是如果两个事务同时读取数据库的某一行,这时,就会发现乐观锁的弊端。


行级锁:行级锁分为共享锁和排它锁。行级锁是 Mysql 中锁定粒度最细的锁。InnoDB引擎支持行级锁和表级锁,只有在通过索引条件检索数据的时候,才使用行级锁,否就使用表级锁。行级锁开销大,加锁慢,锁定粒度最小,发生锁冲突概率最低,并发度最高


表级锁:表级锁分为表共享锁和表独占锁。表级锁开销小,加锁快,锁定粒度大、发生锁冲突最高,并发度最低
页级锁:页级锁是 MySQL 中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。

所以取了折衷的页级,一次锁定相邻的一组记录。BDB 支持页级锁。开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。


排它锁(exclusive locck) :排它锁又叫写锁,如果事务 T 对 A 加上排它锁,则其它事务都不能对 A 加任何类型的锁。获准排它锁的事务既能读数据,又能写数据。


共享锁(share lock) :共享锁又叫读锁,如果事务 T 对 A 加上共享锁,则其它事务只能对 A 再加共享锁,不能加其它锁。获准共享锁的事务只能读数据,不能写数据。

关于间隙锁 https://www.cnblogs.com/crazylqy/p/7821481.html

你可能感兴趣的:(计算机基础)