> 文章列表 > MySQL事务的四大特性及事务的隔离级别

MySQL事务的四大特性及事务的隔离级别

MySQL事务的四大特性及事务的隔离级别

什么是事务?Transaction

常言道:能不麻烦就不麻烦,能简单化就简单化。但是为什么需要事务呢? 事务:用来保证一个业务的完整性,最大的优势就是回滚,并撤销正在进行的所有未提交的修改; 作用是:事务关联业务,业务中的步骤要么成功,要么全部撤销

事务必须在innodb聚集索引下使用,myisam非聚集索引事务无效。

事务有什么特性?

特性,说到事务不得不说ACID 要是面试官问到事务,从ACID开始说起,就很能用自己的语言表述出来你所了解到的事务

在MYSQL下系统默认自动提交事务,单条SQL语句,数据库系统自动将其作为一个事务执行,这种事务被称为隐式事务。

手动把多条SQL语句作为一个事务执行,使用BEGIN开启一个事务,使用COMMIT提交一个事务,这种事务被称为显式事务

A:原子性:Atomicity

每个事务都是一个独立的整体,事务是最小单位,不可拆分,事务要么成功,要么回滚,不可部分成功,部分失败 什么是回滚? 事务发生回滚就是把之前所有的步骤全部撤销(这也是原理)

C:一致性:consistency

简单说就是:操作之前与操作之后都处于一致性的状态

I:隔离性:Isolation

数据库会给每个用户开启事务,但是一个事务不能被其他事物所影响,多个并发事务之间要相互隔离(并发读)

D:持久性:Durability

在事务提交时,数据的改变是永久的,即便系统故障也不会丢失。

事务的隔离性?

事务的操作,一共分为两种:读事务(select)和修改事务(insert,update),如果没有隔离性操作,多个事务可以对一个事务进行修改,最终究达不到想要的效果,回想一下要是所有人都可以修改你的事务,那岂不是你的业务项目就很危险了,安全性低。 例如:

  1. 两个事务对同一条事务进行修改,可能造成数据丢失
  2. 一个事务读取另一个事务未提价的事务,脏读
  3. 一个事务读取事务的同时,另一个事务正在修改此条数据,多次读取返回来不同的数据
  4. 一个事务在一定范围内查询,另一个事务数据进行添加或者删除操作,可以在本事务中查询到,这就出现了数据的幻读

保证事务的安全性,一个回话可操作性的级别,决定能被其他会话操作的程度。 隔离性越高,效率越低,安全性越高,读并发越低

事务的隔离级别:

UNCOMMITTED:read uncommitted---未提交读---不安全--不安全极端

未提交读:一个事务可以读取另一个事务中未提交的数据

比如你在一个公司里,老板说要不我们更改一下上班机制(事务),不在九九六了(修改),周末双休(修改),但是还没有真正提交实施(未提交),但是你听到了修改机制的这件事情(读取未提交事务),然后你周六就真的不去上班了,事后可想而知了.....情况很严重

会出现的问题:脏读,不可重复读,幻读

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
复制代码

COMMITTED:read committed--- 提交读----Oracle默认给出的级别,数据量大

提交读:一个事务读取数据必须在另一个数据提交后。 你拿着银行卡去买单,卡里余额一万五,此时你老婆拿着拿着你的副卡跟朋友去购物,买了一个包一万五,并提交,此时你在用你的 卡买单时查询卡余额时,发现卡里没钱了。就是多个事务可以同时进行修改并提交,发生了提交读,不可重复读的机制。

SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
复制代码

会出现的问题:不可重复读,幻读。 不会出现:脏读

REAPTABLE: repeatable read----重复读--- MYSQL默认给出的隔离级别

可重复读,就是在开始读取数据(事务开启)时,不再允许修改操作。幻读的出现:一个事务读取不到另一个事务insert并且提交的数据,但是可以进行修改 就是你拿着卡去买单,卡里余额一万五,但是此时你老婆拿着副卡也去买单,但是此时是用不了的,因为你正在用着这张卡,你开启了事务,你老婆买单这个事务不能对卡进行操作。

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
复制代码

会出现的问题:幻读。 不会出现:脏读,不可重复读,

SERIALIZABLE: serializable--串行化----锁机制--最安全的机制效率低

最高级的事务隔离,事务不相互冲突,每一个数据行都加上了共享锁,保证安全性的同时,降低了效率,适用于安全情况要求特别高的情况下,同时可能出现超时的现象和锁竞争的现象

SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
复制代码

不会出现:脏读,不可重复读,幻读

事务隔离性产生的问题:

脏读:

事务读取了另一个事务未提交的数据,

不可重复读:

事务A在第一次读取数据后,事务B对数据进行了修改并提交,事务A在重复读取数据时发生改变 第二次读取的数据具体内容与第一次读取的数据内容不一致,不会发生数据行数或者列数的改变

幻读

事务A在一定范围内进行查询,事务B对A查询范围的数据进行添加或者删除数据,在事务A中可以在一定范围内查询到事务B修改后的数据 第二次读取数据与第一次读取数据的不一致,发生了行数上的改变。

操作事务你需要知道的操作:

-- 查看是否为自动提交
SHOW SESSION VARIABLES LIKE 'autocommit';
-- 开启或关闭自动提交,开启为1,关闭为0
SET autocommit=1;
-- 查看自动性
select @@autocommit;
-- 查看隔离性级别
SELECT @@tx_isolation;-- 开启事务1
begin;
--开启事务1
start transaction;
-- 事务提交
commit;
-- 事务回滚
rollback;
复制代码

end》》》