一、事务简介

事务是一组操作的集合,它是一一个不可分割的工作单位,事务会把所有的操作作为- -个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。

二、有关事务操作

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事务、隔离级别的更多相关文章

  1. [51CTO]新说MySQL事务隔离级别!

    新说MySQL事务隔离级别! 事务隔离级别这个问题,无论是校招还是社招,面试官都爱问!然而目前网上很多文章,说句实在话啊,我看了后我都怀疑作者弄懂没!本文所讲大部分内容,皆有官网作为佐证,因此对本文内 ...

  2. 查询mysql事务隔离级别

    查询mysql事务隔离级别 查询mysql事务隔离级别 分类: DB2011-11-26 13:12 2517人阅读 评论(0) 收藏 举报 mysqlsessionjava   1.查看当前会话隔离 ...

  3. MySQL事务隔离级别测试实例

    https://www.cnblogs.com/huanongying/p/7021555.html MySQL事务隔离级别 事务隔离级别 脏读 不可重复读 幻读 读未提交(read-uncommit ...

  4. Mysql事务-隔离级别

    MYSQL事务-隔离级别 事务是什么? 事务简言之就是一组SQL执行要么全部成功,要么全部失败.MYSQL的事务在存储引擎层实现. 事务都有ACID特性: 原子性(Atomicity):一个事务必须被 ...

  5. MySQL事务隔离级别 解决并发问题

    MySQL事务隔离级别 1. 脏读: 骗钱的手段, 两个窗口或线程分别调用数据库转账表,转账后未提交,对方查看到账后,rollback,实际钱没转. 演示方法: mysql默认的事务隔离级别为repe ...

  6. mysql事务隔离级别、脏读、幻读

    Mysql事务隔离级别本身很重要,再加上可能是因为各大公司面试必问的缘故,在博客中出现的概率非常高,但不幸的是,中国的技术博客要么是转载,要么是照抄,质量参差不齐,好多结论都是错的,对于心怀好奇之心想 ...

  7. mysql事务隔离级别与设置

    mysql数据库,当且仅当引擎是InnoDB,才支持事务: 1.隔离级别 事务的隔离级别分为:未提交读(read uncommitted).已提交读(read committed).可重复读(repe ...

  8. MySQL事务隔离级别(二)

    搞清楚MySQL事务隔离级别 首先创建一个表 account.创建表的过程略过(由于 InnoDB 存储引擎支持事务,所以将表的存储引擎设置为 InnoDB).表的结构如下: 为了说明问题,我们打开两 ...

  9. MySQL事务隔离级别(一)

    本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做 ...

  10. 面试突击61:说一下MySQL事务隔离级别?

    MySQL 事务隔离级别是为了解决并发事务互相干扰的问题的,MySQL 事务隔离级别总共有以下 4 种: READ UNCOMMITTED:读未提交. READ COMMITTED:读已提交. REP ...

随机推荐

  1. 解读WPF中的Binding

    1.Overview 基于MVVM实现一段绑定大伙都不陌生,Binding是wpf整个体系中最核心的对象之一这里就来解读一下我花了纯两周时间有哪些秘密.这里我先提出几个问题应该是大家感兴趣的,如下: ...

  2. 「NOI十联测」深邃

    「NOI十联测」深邃 要使得最大的连通块最小,显然先二分答案. 先固定1结点为根. 对于一个果实,显然是先处理子树中未分配的点,再向外延伸. 每个结点记录一个\(si[]\),表示子树中未分配的点数, ...

  3. springboot druid 数据库连接池连接失败后一直重连

    在使用个人阿里云测试机,在查询实时输出日志时,看到数据库连接失败后,服务器一直在重连服务器.开始以为是遭受重复攻击,后面把服务重启后,就没有出现一直重连的情况.看以下输出日志: 2022-02-09 ...

  4. Redis 的持久化有哪几种方式?

    面试题 redis 的持久化有哪几种方式? 不同的持久化机制都有什么优缺点? 持久化机制具体底层是如何实现的? 面试官心理分析 redis 如果仅仅只是将数据缓存在内存里面,如果 redis 宕机了再 ...

  5. Leetcode随缘刷题之寻找两个正序数组的中位数

    我一上来没读清题,想着这题这么简单,直接就上手写了: package leetcode.day_12_05; import java.util.ArrayList; import java.util. ...

  6. 简述redis特点及其应用场景

    1. Redis八大特点 1.1. 速度快 说到Redis的速度快,大家的第一反应一定是内存读取,那是肯定的,但如果面试的时候仅仅说到这点,那还是远远不够的,至少还有以下三点要补充: Redis是用C ...

  7. 二叉树的基本操作(C语言版)

    今天走进数据结构之二叉树 二叉树的基本操作(C 语言版) 1 二叉树的定义 二叉树的图长这样: 二叉树是每个结点最多有两个子树的树结构,常被用于实现二叉查找树和二叉堆.二叉树是链式存储结构,用的是二叉 ...

  8. 框架5--nginx安装部署 下(web服务)

    目录 1.提纲 2.Nginx虚拟主机 3.Nginx日志 4.Nginx访问控制模块 5.Nginx状态监控模块 6.访问连接控制模块 框架5--nginx安装部署 下(web服务) 1.提纲 1. ...

  9. 6、前端--DOM操作(查找标签、节点操作、获取值操作、class操作、样式操作、绑定事件、内置参数this)

    DOM操作之查找标签 前缀关键字>>>:document # 基本查找(核心) document.getElementById 根据ID获取一个标签 document.getElem ...

  10. 【第二十四期】golang 一年经验开发 富途

    他们家是按题目来的,从一个小题目慢慢延伸着问,由浅入深,问到你换题为止. 第一题 给了一个网址,解释一下浏览器填入这个网址后发生了什么? TCP为什么要三次握手四次挥手? 502是什么? 如果出现50 ...