mysql事务问题

一、事务并发问题

1.脏读

A事务读取到B未提交事务的数据

2.不可重复读

同一事务查询结果不同,可能是其他事务提交了更新数据

3.幻读

A事务查询无数据,B事务这时插入数据,A事务还是没查到数据,但是插入会报错。

二、事务四种隔离级别

1.READ UNCOMMITTED 读未提交

脏读、不可重复读、幻读都会发生

2.READ COMMITTED 读已提交

脏读不会发生,不可重复读、幻读会发生

3.REPEATABLE READ 可重复读 (MySQL默认级别)

脏读,不可重复读不会发生,幻读会发生

4.SERIALIZABLE 串行化

脏读、不可重复读、幻读都不会发生

三、案例

1.查询、设置隔离级别

SELECT @@TRANSACTION_ISOLATION;
查询结果
在这里插入图片描述
MySQL默认的是REPEATABLE READ。
更改隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
成功后再查询一次,发现已经改变
在这里插入图片描述
session代表当前会话,也可以换成GLOBAL,代表全局,level后面则是设置四种隔离级别。

2.验证

准备工作:
创建测试数据库并创建测试表和数据
创建一个学生表在这里插入图片描述

用到两个命令行登录mysql

(1)验证脏读

隔离级别设置为read uncommitted
开始事务查询一次,得到结果
在这里插入图片描述
然后我们在另一个命令行中运行更新的操作,但是不提交事务
在这里插入图片描述
在第一个命令行中再次查询一次,发现结果已改变
在这里插入图片描述
我们把隔离级别换成read committed后再重复上述操作
第一个命令行查询
在这里插入图片描述
然后另一个命令行执行更新的操作,但不提交事务
在这里插入图片描述
切回第一个命令行再次查询,发现值没有改变
在这里插入图片描述
第二个命令行执行commit提交事务,再用第一个命令行查询,发现值改变了
在这里插入图片描述

(2)验证不可重复读

开启事务查询
在这里插入图片描述
另一个命令行进行更新
在这里插入图片描述
再次查询发现数据没有变化,说明没有发生脏读
在这里插入图片描述
我们提交更新的事务,再次查询,发现数据更改了
在这里插入图片描述
三次查询的数据不一致,这就是不可重复读。当我们把隔离级别设置为repeatable read时就会发现同一事务三次查询的数据是一样的,把事务提交后再查询,数据发生了改变。

(3)验证幻读

查询id为3的数据,返回为空
在这里插入图片描述
在另一个命令行中添加id为3的数据并提交事务
在这里插入图片描述
切回第一个命令也添加id为3的数据,发现主键重复了
在这里插入图片描述
再查询一次还是为空
在这里插入图片描述
这就是幻读。
我们把隔离级别换成serializable,查询id为4的数据
在这里插入图片描述
另一个命令行中添加数据
在这里插入图片描述
不难发现光标一直在闪烁,是因为阻塞了,在等前面的事务执行完成,长时间没提交的话会报错超时
在这里插入图片描述
在第一个命令行中进行数据的添加并提交
在这里插入图片描述
这时候第二个命令行就会报错主键已存在
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL 事务是指一组数据库操作,这些操作要么全部执行,要么全部不执行,其目的是保证在并发环境下,数据的一致性和完整性。MySQL 事务具有 ACID 性质,即原子性、一致性、隔离性和持久性。 MySQL 中使用事务需要使用 BEGIN、COMMIT 和 ROLLBACK 语句,其中 BEGIN 表示开启一个事务,COMMIT 表示提交事务,ROLLBACK 表示回滚事务事务的基本语法如下: ``` BEGIN; -- 执行一组数据库操作 COMMIT; -- 提交事务 -- 或者 ROLLBACK; -- 回滚事务 ``` 在 MySQL 中,事务的隔离级别分为四个等级,分别是 Read Uncommitted、Read Committed、Repeatable Read 和 Serializable。隔离级别越高,数据的一致性和完整性越高,但同时也会影响数据库的性能。 MySQL 事务的 ACID 性质有以下含义: 1. 原子性(Atomicity):事务中的所有操作要么全部执行成功,要么全部失败回滚,不会只执行其中的一部分操作。 2. 一致性(Consistency):事务执行前后,数据库中的数据必须保持一致性状态,即满足数据库的约束条件和完整性规则。 3. 隔离性(Isolation):事务之间应该是相互隔离的,一个事务的执行不应该被其他事务干扰,保证事务之间的数据相互独立。 4. 持久性(Durability):事务提交后,对数据库的修改应该是永久性的,即使出现系统故障或电源故障,也不应该对数据产生影响。 总之,MySQL 事务是一组数据库操作,具有 ACID 性质,可以通过 BEGIN、COMMIT 和 ROLLBACK 语句来实现,隔离级别越高,数据的一致性和完整性越高,但同时也会影响数据库的性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值