Loading

数据库事务

事务概述

事务(Transaction)是由一系列对系统中数据进行访问与更新的操作所组成的一个程序执行逻辑单元。数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。

  • ACID

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

  • 隔离级别

ACID这4个特征中,最难理解的是隔离性。在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同。4个隔离级别分别是:读未提交(READ_UNCOMMITTED)、读已提交(READ_COMMITTED)、可重复读(REPEATABLE_READ)、顺序读(SERIALIZABLE)

  • 事务并发引起的问题

数据库在不同的隔离性级别下并发访问可能会出现以下几种问题:脏读(Dirty Read)、不可重复读(Unrepeatable Read)、幻读(Phantom Read)

事务的思维导图:

ACID

  • 原子性(Atomicity)

事务的原子性是指事务必须是一个原子的操作序列单元。事务中包含的各项操作在一次执行过程中,只允许出现两种状态之一。

要么全部执行成功;要么全部执行失败 。任何一项操作失败都会导致整个事务的失败,同时其它已经被执行的操作都将被撤销并回滚,只有所有的操作全部成功,整个事务才算是成功完成。

  • 一致性(Consistency)

事务的一致性是指事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处以一致性状态。

比如:如果从A账户转账到B账户,不可能因为A账户扣了钱,而B账户没有加钱。

  • 隔离性(Isolation)

事务的隔离性是指在并发环境中,并发的事务是互相隔离的,一个事务的执行不能被其它事务干扰。也就是说,不同的事务并发操作相同的数据时,每个事务都有各自完整的数据空间。一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务是不能互相干扰的。

隔离性分4个级别

  • 持久性(Duration)

事务的持久性是指事务一旦提交后,数据库中的数据必须被永久的保存下来。即使服务器系统崩溃或服务器宕机等故障。只要数据库重新启动,那么一定能够将其恢复到事务成功结束后的状态。

事务处理

1、事务处理的常用命令

操作 命令
查看存储引擎 SHOW CREATE TABLE 表名;
更改引擎 ALTER TABLE 表名 ENGINE=新引擎名;
回滚 ROLLBACK;
声明事务开始 BEIGIN;
事务提交 COMMIT;
查询自动提交功能状态 SELECT @@AUTOCOMMIT;
设置自动提交功能 SET AUTOCOMMIT=0或1;
设置分离水平 SET SESSION TRANSACTION ISOLATION LEVEL 分离水平;

2、存储引擎

MyISAM 高速引擎,不支持事务处理
InnoDB 支持行锁定以及事务处理,速度比MyISAM稍慢
ISAM MyISAM的前身
MERGE 将多个MyISAM类型的表作为一个表来处理的引擎
MEMORY,HEAP 只在内存上保存数据
Falcon 一种新的存储引擎,支持事务处理
ARCHIVE 将数据压缩后保存(只能支持INSERT/SELECT操作
CSV 以CSV形式保存数据(应用于跨平台数据交换)

事务处理是一毁全毁,因此事务中任意一个任务或指令失败,整个事务都将失败。是怎么实现的呢?方法是时间中多个任务全部成功,则任务成功结束,并且会进行提交(COMMIT),如果任何一件任务失败,则强制回滚(ROLLBACK)到初始状态。

事务处理涉及到三个最重要的命令:BEGIN,ROLLBACK,COMMIT,分别表示声明事务开始,回滚,确认提交。

3、回滚

事务在BEGIN之后但还没COMMIT的时候可以用ROLLBACK回滚到BEGIN之前的数据,而如果COMMIT提交之后则不能用ROLLBACK回滚到原来的数据。

4、自动提交

当搜索引擎为MyISAM时,因为不支持事务处理,因此命令一旦执行,就一定会提交,这种默认的提交方式被称为自动提交。

而当搜索引擎设置为InnoDB时,可以设置自动提交功能是否开启,当自动提交功能为ON时,命令执行就会提交(COMMIT),而自动提交设置为OFF 时,必须执行COMMIT才提交,可以使用ROLLBACK进行回滚。

查询当前自动提交功能状态:

SELECT @@AUTOCOMMIT;

设置自动提交功能:

SET AUTOCOMMIT=0或1;

5、部分回滚

直接ROLLBACK会回滚到BEGIN开始之前的地方,而通过SAVEPOINT可以保存一个点,通过ROLLBACK TO SAVEPOINT就可以回滚到保存点了,也就实现了“想去哪就去了哪”。

部分回滚主要有两个步骤:

  • 保存点
SAVEPOINT 保存点名;
  • 回滚到保存点
ROLLBACK TO SAVEPOINT 保存点名;

6、不能事务处理的命令(直接提交)

大部分命令都可以通过事务处理(BEGIN -ROLLBACK- COMMIT)进行操作,但是:

  • DROP DATABASE;

  • DROP TABLE;

  • DROP;

  • ALTER TABLE

不能通过事务处理,会直接COMMIT

数据库锁

锁定分为共享锁定(Shared Lock)和排他锁定(Exclusive Lock):

  • 共享锁定是将对象数据变为只读形式,不能进行更新,所以也称为读取锁定;

  • 排他锁定是当执行INSERT/UPDATE/DELETE的时候,其它事务不能读取该数据,因此也称为写入锁定。

锁定的粒度:锁定对象的大小是锁定的粒度,有三种粒度:

  • 记录

  • 数据库

需要使用锁定来有效解决事务冲突的情况,但是锁定也会使性能下降(因为别人无法访问),因此频繁锁定不一定合理,数据库中,使用分离水平来表示事务处理之间的影响程度。

事务隔离级别

  1. 读未提交(READ UNCOMMITTED)

读未提交,该隔离级别允许脏读,其隔离级别是最低的。换句话说,如果一个事务正在处理某一数据,并对其进行了更新,但同时尚未完成事务,因此还没有提交事务;而与此同时,允许另一个事务也能够访问该数据。

  1. 读已提交(READ COMMITTED)

一个事务开始,查询了一条记录。这是另一个事务修改了这个记录,当弟一个事务再次查询时出现了不一样的结果。出现了不可重复读的现象。读已提交是一个事务在没有结束的情况下允许另一个事务对数据进行修改。

  1. 可重复读(REPEATABLE READ)

保证一个事务在没有结束之前查询到的同一个数据是相同的,也就是说在事务开启之后不允许其他事务执行update操作,但是可以执行insert操作,这就会造成幻读现象。

  1. 顺序读(SERIALIZABLE)

顺序读是最严格的事务隔离级别。它要求所有的事务排队顺序执行,即事务只能一个接一个地处理,不能并发。

分离水平 脏读 不可重复读取 幻象读取
READ UNCOMMITED
READ COMMITED ×
REPEATABLE READ × ×
SERIALIZABLE × × ×

4种事务隔离级别从上往下,级别越高,并发性越差,安全性就越来越高。一般数据默认级别是读以提交或可重复读。

设置事务隔离级别

SET SESSION TRANSACTION ISOLATION LEVEL 分离水平;

对幻读的理解参考:https://zhuanlan.zhihu.com/p/103580034

posted @ 2021-10-01 16:59  yinbit  阅读(248)  评论(0)    收藏  举报