mysql事务、隔离级别
一、事务简介
事务是一组操作的集合,它是一一个不可分割的工作单位,事务会把所有的操作作为- -个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
二、有关事务操作
mysql中的事务是默认的自动提交的,我们可以手动的去关闭 或者开启事务
#查看事务是否自动提交
select @@autocommit; # 等于1 默认自动提交 #设置事务提交方式
set @@autocommit = 0; # 关闭自动提交事务 #也可以直接设置开启事务
start transaction ;
#或着
begin ; #提交事务 如果业务操作正常完成就提交事务
commit ; #回滚事务 如果业务操作在执行过程中出现异常 回滚事务保证事务的完整性和正确性
rollback ;
三、事务的四大特性(ACID)
原子性(Atomicity) : 事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
一致性 (Consistency) : 事务完成时,必须使所有的数据都保持一致状态。
隔离性(Isolation) : 数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
持久性(Durability) : 事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
四、并发事务问题
1、脏读
一个事务读到另一个事务还没有提交的事务。
2、不可重复读
一个事务先后读取同一条记录,但两次读取的数据不同。
3、幻读
一个事务在按照条件查询数据时,没有这条数据,但是在插入数据时却又发现有这条数据已经存在,好像出现了“幻觉”。
五、事务的隔离级别
1、读未提交(Read uncommitted)
可能出现:脏读、不可重复读、幻读;隔离级别最差,性能最高。
2、读已提交(Read committed)
可能出现:不可重复读、幻读。
3、可重复读(Repeatable Read(mysql的默认隔离级别))
可能出现:幻读。
4、串行化(Serializable)
上述并发问题都可解决,隔离级别最高,但是性能最差。
#查看事务隔离级别
select @@transaction_isolation; # REPEATABLE-READ #设置事务的隔离级别
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 ;
场景一
在idea中开启两个控制台,设置事务级别为 读未提交隔离级别 并开启事务
控制台1 第一次查询

控制台2 执行如下语句 未提交

控制台1 再次查询

可见在控制台2执行更新操作后,还没提交,控制台1再次执行查询操作时,查询到的数据已经改变了,证实了读未提交发生脏读现象。
场景二
在idea中开启两个控制台,设置事务级别为 读已提交隔离级别 并开启事务
控制台1 第一次查询

控制台2 执行如下语句 未提交

控制台1 再次查询

证实了事务的隔离级别设置为读已提交解决了脏读问题
场景三
在idea中开启两个控制台,设置事务级别为 读已提交 并开启事务
控制台2 执行如下语句 未提交

控制台1 第一次查询

控制台2 执行commit提交后 控制台1 再次查询结果不同

可见在控制台1在一次事务中,在控制台2更新前后查询到的数据不同,证实了读已提交发生了不可重复读问题
场景四
在idea中开启两个控制台,设置事务级别为 可重复读隔离级别 并开启事务
控制台2 执行如下语句 未提交

控制台1 第一次查询

控制台2 执行commit提交后 控制台1 再次查询结果相同

可见在控制台1在一次事务中,在控制台2更新前后查询到的数据不同,证实了可重复读隔离级别解决了不可重复读问题
场景五
在idea中开启两个控制台,设置事务级别为 可重复读隔离级别 并开启事务
控制台1 第一次查询 为空


控制台2 执行插入 并提交

控制台1 执行相同的插入sql 发现已经存在 于是就查询,但是又查不到数据
对于控制台1来说就像是“幻觉”一样,证实了可重复读隔离级别发生了幻读问题
场景六
在idea中开启两个控制台,设置事务级别为 串行化隔离级别 并开启事务
控制台1 执行查询 为空


控制台2 执行插入 可见操作阻塞

控制台1提交事务后,控制台1才能够完成插入操作
这种阻塞的效果有效的避免了幻读问题,证实了串行化隔离级别解决了幻读问题
总结:实际使用还得根据业务本身去设置隔离级别,隔离级别最高性能也最差,隔离级别低的性能较好。
mysql事务、隔离级别的更多相关文章
- [51CTO]新说MySQL事务隔离级别!
新说MySQL事务隔离级别! 事务隔离级别这个问题,无论是校招还是社招,面试官都爱问!然而目前网上很多文章,说句实在话啊,我看了后我都怀疑作者弄懂没!本文所讲大部分内容,皆有官网作为佐证,因此对本文内 ...
- 查询mysql事务隔离级别
查询mysql事务隔离级别 查询mysql事务隔离级别 分类: DB2011-11-26 13:12 2517人阅读 评论(0) 收藏 举报 mysqlsessionjava 1.查看当前会话隔离 ...
- MySQL事务隔离级别测试实例
https://www.cnblogs.com/huanongying/p/7021555.html MySQL事务隔离级别 事务隔离级别 脏读 不可重复读 幻读 读未提交(read-uncommit ...
- Mysql事务-隔离级别
MYSQL事务-隔离级别 事务是什么? 事务简言之就是一组SQL执行要么全部成功,要么全部失败.MYSQL的事务在存储引擎层实现. 事务都有ACID特性: 原子性(Atomicity):一个事务必须被 ...
- MySQL事务隔离级别 解决并发问题
MySQL事务隔离级别 1. 脏读: 骗钱的手段, 两个窗口或线程分别调用数据库转账表,转账后未提交,对方查看到账后,rollback,实际钱没转. 演示方法: mysql默认的事务隔离级别为repe ...
- mysql事务隔离级别、脏读、幻读
Mysql事务隔离级别本身很重要,再加上可能是因为各大公司面试必问的缘故,在博客中出现的概率非常高,但不幸的是,中国的技术博客要么是转载,要么是照抄,质量参差不齐,好多结论都是错的,对于心怀好奇之心想 ...
- mysql事务隔离级别与设置
mysql数据库,当且仅当引擎是InnoDB,才支持事务: 1.隔离级别 事务的隔离级别分为:未提交读(read uncommitted).已提交读(read committed).可重复读(repe ...
- MySQL事务隔离级别(二)
搞清楚MySQL事务隔离级别 首先创建一个表 account.创建表的过程略过(由于 InnoDB 存储引擎支持事务,所以将表的存储引擎设置为 InnoDB).表的结构如下: 为了说明问题,我们打开两 ...
- MySQL事务隔离级别(一)
本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做 ...
- 面试突击61:说一下MySQL事务隔离级别?
MySQL 事务隔离级别是为了解决并发事务互相干扰的问题的,MySQL 事务隔离级别总共有以下 4 种: READ UNCOMMITTED:读未提交. READ COMMITTED:读已提交. REP ...
随机推荐
- 如何在 VS Code 中为 Java 类生成序列化版本号
前言 IDEA 提供自动生成序列化版本号的功能,其实 VS Code 也可以,只是默认关闭了这个功能,下面就来看看如何开启这个功能吧. 配置过程 首先需要保证 VS Code 上安装了提供 Java ...
- [源码解析] 模型并行分布式训练 Megatron (3) ---模型并行实现
[源码解析] 模型并行分布式训练 Megatron (3) ---模型并行实现 目录 [源码解析] 模型并行分布式训练 Megatron (3) ---模型并行实现 0x00 摘要 0x01 并行Tr ...
- express源码分析之Router
express作为nodejs平台下非常流行的web框架,相信大家都对其已经很熟悉了,对于express的使用这里不再多说,如有需要可以移步到www.expressjs.com自行查看express的 ...
- UTF-8编码规则(摘自JDK官方文档)
- synchronize类锁用父类作为锁能否锁住代码块
如果有一个父类,Demo如下 public class Demo { public void demo1(){ synchronized (Demo.class){ while (true){ Sys ...
- Java线程--Callable使用
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11871727.html Java线程--Callable使用 Callable和Runnabl ...
- python继承关系中,类属性的修改
class Grandfather(object): mylist = [] def __init__(self): pass class Father(Grandfather): pass Gran ...
- Annotation深入研究——@Documented注释使用
Documented注释的作用及其javadoc文档生成工具的使用 代码放在MyDocumentedtAnnotationDemo.java文件中 package org.yu.demo16.docu ...
- Mac 屏幕录制Gif 制作 By-胡罗
一.视频录制 1)使用Mac系统自带的QuickTime进行屏幕录像 手动打开(如下图) 详细 Mac 基础教程:如何使用 Mac 系统原生的屏幕录制功能 相关快捷键 option+command+n ...
- 给 zsh 自定义命令添加参数自动补全
有时我会自定义一些 zsh 命令,以便提升某些高频操作的效率.本文记录我给一个自定义命令添加参数自动补全的方法. 场景 我自定义了一个 zsh 命令 gmt,执行 gmt <b2>,可以将 ...