一、事务简介

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

二、有关事务操作

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. linux系统——Redis集群搭建(主从+哨兵模式)

    趁着这几天刚好有点空,就来写一下redis的集群搭建,我跟大家先说明,本文的redis集群因为linux服务器只是阿里云一台服务器,所以集群是redis启动不同端口,但是也能达到集群的要求.其实不同服 ...

  2. Understanding C++ Modules In C++20 (1)

    Compiling evironment: linux (ubuntu 16.04)+ gcc-10.2. The Post will clarify and discuss what modules ...

  3. 关于mysql,需要掌握的基础(二):JDBC和DAO层

    ​ 目录 关于mysql,需要掌握的基础(二):JDBC和DAO层 1.了解jdbc是什么? 2.加载注册驱动:为什么Class.forName("com.mysql.jdbc.Driver ...

  4. 分子动力学模拟之基于自动微分的LINCS约束

    技术背景 在分子动力学模拟的过程中,考虑到运动过程实际上是遵守牛顿第二定律的.而牛顿第二定律告诉我们,粒子的动力学过程仅跟受到的力场有关系,但是在模拟的过程中,有一些参量我们是不希望他们被更新或者改变 ...

  5. vc获取进程版本号

    #param comment(lib, "version.lib") CString &CMonitorManagerDlg::GetApplicationVersion( ...

  6. Windows 7 Ubuntu 修改系统启动加载项

    由于现在硬盘越来越大,越来越廉价.所以越来越多的很为了方便工作学习,在一台物理机上安装多个操作系统. 下面我们就来介绍安装多个操作系统后,每次开机后,到底默认引导哪个系统,由谁说的算? 由引导项说的算 ...

  7. maven转web项目时 在Project Facets下转换时 Further configuration available没有出现

    如果下边的 further configuration available不出来 把Dynamic web module 去掉勾选,应用与项目,然后再点开项目的properties,再选中Dynami ...

  8. Eclipse项目上的红叉解决方案

    Eclipse项目上存在红叉,但是又不影响运行,同时展开项目未指明任何内容出错,可以按如下步骤进行处理: 0.查看Problems视图,定位错误,发现处理之: 1.检查Build Path中的各个依赖 ...

  9. Linux常用命令整理:文件目录管理

    据说,你要对Linux文件做的事情,98%都记录在这篇文章里了. 1.ls命令 最常见的命令,相信刚进入linux命令行界面的时候,都要用这个命令看看当前目录下都有哪些文件吧. 名称:List 含义: ...

  10. 谷粒商城Day1

    环境搭建 安装JDK1.8: 1 下载并解压jdk1.8 tar -zxvf jdk-8u281-linux-x64.tar.gz(检查本机有没有jdk有的话卸载掉.安装上自己的jdk) 2 配上环境 ...