MySQL事务

2 篇文章 0 订阅
2 篇文章 0 订阅

MySQL事务
相关示例基于MySQL8.0和Navicat。

事务

定义

数据库事务是构成单一逻辑工作单元的操作集合。

特性

1.原子性(Atomicity):事务中的所有操作作为一个不可分割的整体,要么全部成功,要么全部失败。
2.一致性(Consistency):事务的执行结果必须使数据库从一个一致性状态到另一个一致性状态。
3.隔离性(Isolation):并发执行的事务不会相互影响,其对数据库的影响和它们串行执行时一样。
4.持久性(Durability):事务一旦提交,其对数据库的更新就是持久的。

常见的并发异常与隔离级别

在Navicat中新建两个查询窗口。可以用一下命令查看是否自动提交和隔离级别。

-- 是否自动提交
SHOW VARIABLES LIKE 'autocommit';
-- 隔离级别
SELECT @@transaction_isolation;

MySQL默认自动提交和可重复读。

脏读是指一个事务读取了另一个事务未提交的数据。一下命令选中执行,不要直接点运行。

查询窗口1:

SET autocommit=0;-- 先设置不自动提交(开启事务)
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;-- 设置隔离级别为读未提交
-- SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
-- SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SELECT * FROM legends;-- 1.查询、3.再执行查询
COMMIT;
ROLLBACK;

查询窗口2:

SET autocommit=0;-- 先设置不自动提交(开启事务)
INSERT INTO legends (title,`name`) values ('猩红收割者','弗拉基米尔');-- 2.插入
COMMIT;
ROLLBACK;

表里的数据:
在这里插入图片描述
查询窗口1的数据:
在这里插入图片描述
可以看到这里读取到了窗口2未提交的数据。

不可重复读是指一个事务对同一数据的读取结果前后不一致,读取到其它事务已提交的数据。需要三个查询窗口对比。
查询窗口1:

set autocommit=0;-- 开启事务
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;-- 隔离级别设置为读已提交
SELECT * FROM legends;

查询窗口2:

set autocommit=0;-- 开启事务,默认可重复读不变。
SELECT * FROM legends;

查询窗口3:

INSERT INTO legends (title,`name`) values ('符文法师','瑞兹');-- 插入一条新数据

先执行窗口1和窗口2的查询语句:
在这里插入图片描述
再执行窗口3的插入语句,会看到窗口1多了一条新数据:
在这里插入图片描述
而窗口2的数据不变,因为可重复读级别是解决了“不可重复读”问题的。
幻读幻读指的是某次读取操作得到的结果所表征的数据状态无法支撑后续的业务操作,并不是说两次读取到的结果集不同。
查询窗口1:

set autocommit=0;
SELECT * FROM legends;
INSERT INTO legends (title,`name`) values ('亡灵战神','塞恩');-- 后续的业务

查询窗口2:

-- ALTER table legends add UNIQUE idx_title (`title`);-- 这里我先添加了一条唯一索引
INSERT INTO legends (title,`name`) values ('亡灵战神','塞恩');

先执行窗口1的查询语句:
在这里插入图片描述
再执行窗口2的插入语句,再次执行窗口1的查询语句,会发现结果不变,最后执行窗口1的插入语句:
在这里插入图片描述
执行报错,查询明明没有“亡灵战神”,是产生幻觉了吗?
异常与隔离级别

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值