我理解的---》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》》》

今天老师说了一句话让我印象深刻:老祖宗的文化不能丢呀,你想想为什么五千年的文化可以流传这么就,就是因为他有道理呀。
道理是道理听不听的进去又是另一回事了,加油

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Recently 祝祝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值