首页 > 数据库 >MYSQL数据库之事务隔离级别详解

MYSQL数据库之事务隔离级别详解

时间:2023-05-15 13:57:28浏览次数:50  
标签:事务 隔离 -- money 数据库 read 详解 MYSQL 级别

本系列为:MySQL数据库详解,为千锋资深教学老师独家创作

致力于为大家讲解清晰MySQL数据库相关知识点,含有丰富的代码案例及讲解。如果感觉对大家有帮助的话,可以【关注】持续追更~

文末有本文重点总结,技术类问题,也欢迎大家和我们沟通交流!

前言

从今天开始本系列内容就带各位小伙伴学习数据库技术。数据库技术是Java开发中必不可少的一部分知识内容。也是非常重要的技术。本系列教程由浅入深, 全面讲解数据库体系。 非常适合零基础的小伙伴来学习。


全文大约 【1505】字,不说废话,只讲可以让你学到技术、明白原理的纯干货!本文带有丰富案例及配图,让你更好的理解和运用文中的技术概念,并可以给你带来具有足够启迪的思考...

一. 事务隔离级别

什么是事务隔离级别呢?对我们的日常操作结果又有什么影响呢?下面带各位小伙伴先来了解下事务隔离级别的概念。

1. 隔离级别的概念

多个客户端操作时 ,各个客户端的事务之间应该是隔离的,相互独立的 , 不受影响的。

如果多个事务操作同一批数据时,则需要设置不同的隔离级别 , 否则就会产生问题 。

2. 四种隔离级别

我们先来了解一下四种隔离级别的名称 , 再来看看可能出现的问题。

1 读未提交 read uncommitted
2 读已提交 read committed
3 可重复读 repeatable read
4 串行化 serializable

3. 可能引发的问题

下面总结了数据库中不同事务隔离级别可能引发的问题。各位小伙伴可以参照下:

问题 现象
脏读 是指在一个事务处理过程中读取了另一个未提交的事务中的数据 , 导致两次查询结果不一致。
不可重复读 是指在一个事务处理过程中读取了另一个事务中修改并已提交的数据, 导致两次查询结果不一致。
幻读 select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入。或不存在执行delete删除,却发现删除成功。

4. 数据库隔离级别操作语法

查询数据库隔离级别:

语法:SELECT  @@TX_ISOLATION;

修改数据库隔离级别:

语法:SET  GLOBAL  TRANSACTION  ISOLATION  LEVEL  级别字符串;

5. 事务隔离级别演示

举个例子:脏读的问题

-- 查询账户表
select * from account;

-- 设置隔离级别为read uncommitted
set global transaction isolation level read uncommitted;

-- 开启事务
start transaction;

-- 转账
update account set money = money - 500 where id = 1;
update account set money = money + 500 where id = 2;

-- 窗口2查询转账结果 ,出现脏读(查询到其他事务未提交的数据)

-- 窗口2查看转账结果后,执行回滚
rollback;

举个栗子:解决脏读的问题和演示不可重复读的问题。

-- 设置隔离级别为read committed
set global transaction isolation level read committed;

-- 开启事务
start transaction;

-- 转账
update account set money = money - 500 where id = 1;
update account set money = money + 500 where id = 2;

-- 窗口2查看转账结果,并没有发生变化(脏读问题被解决了)

-- 执行提交事务。
commit;

-- 窗口2查看转账结果,数据发生了变化(出现了不可重复读的问题,读取到其他事务已提交的数据)

举个栗子:解决不可重复读的问题。

-- 设置隔离级别为repeatable read
set global transaction isolation level repeatable read;

-- 开启事务
start transaction;

-- 转账
update account set money = money - 500 where id = 1;
update account set money = money + 500 where id = 2;

-- 窗口2查看转账结果,并没有发生变化

-- 执行提交事务
commit;

-- 这个时候窗口2只要还在上次事务中,看到的结果都是相同的。
-- 只有窗口2结束事务,才能看到变化(不可重复读的问题被解决)

6. 隔离级别总结

编号 隔离级别 名称 出现脏读 出现不可重复读 出现幻读 数据库默认隔离级别
1 read uncommitted 读未提交
2 read committed 读已提交 Oracle / SQL Server
3 repeatable read 可重复读 MySQL
4 serializable 串行化

注意: 隔离级别从小到大安全性越来越高,但是效率越来越低 , 所以不建议使用READ UNCOMMITTED 和 SERIALIZABLE 隔离级别。


二. 结语

最后在这里对本文核心要点进行总结:

1.  理解脏读、幻读、不可重复读产生的原因和解决办法。

2.  各位小伙伴熟练记住不同隔离级别以及会导致的问题。


以上就是本文的全部内容了,更多技术类干货,可以持续关注~

标签:事务,隔离,--,money,数据库,read,详解,MYSQL,级别
From: https://www.cnblogs.com/qian-fen/p/17401639.html

相关文章

  • MySQL 基础内容
    事务Mysql的事务是由一系列的SQL指令所构成的逻辑处理单元,这些指令要么全部执行,要么全部不执行,可以使用COMMIT或ROLLBACK指令来结束一个事务。Mysql中事务的ACID特性:原子性(Atomicity),事务中的所有操作要么全部执行成功,要么全部回滚。一致性(Consistency),事务必须......
  • MySQL的varchar存储原理:InnoDB记录存储结构
    摘要:varchar(M)能存多少个字符,为什么提示最大16383?innodb怎么知道varchar真正有多长?记录为NULL,innodb如何处理?某个列数据占用的字节数非常多怎么办?影响每行实际可用空间的因素有哪些?本篇围绕innodb默认行格式dynamic来说说原理。本文分享自华为云社区《MySQL的varchar水真的太深......
  • windows mysql安装
      [mysqld]#设置3306端口port=3306#设置mysql的安装目录basedir=D:\lvse\mysql-5.7.41-winx64#设置mysql数据库的数据的存放目录datadir=D:\lvse\mysql-5.7.41-winx64\data#允许最大连接数max_connections=200#允许连接失败的次数。这是为了防止有人从该主机试......
  • Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class
    报错代码Loadingclass`com.mysql.jdbc.Driver'.Thisisdeprecated.Thenewdriverclassis`com.mysql.cj.jdbc.Driver'.ThedriverisautomaticallyregisteredviatheSPIandmanualloadingofthedriverclassisgenerallyunnecessary.Exceptionin......
  • mysql将一个表的数据导入到另一个表
     将一个表的数据插入到另外一个表中的几种情况如下:1.如果2张表的字段一致,并且希望插入全部数据,可以用这种方法:   INSERT INTO目标表SELECT*FROM来源表;   例如:insertintoinsertTestselect*frominsertTest2;2.如果只希望导入指定字段,可以用这种方法: ......
  • 架构师日记-从数据库发展历程到数据结构设计探析
    作者:京东零售刘慧卿一数据库发展史起初,数据的管理方式是文件系统,数据存储在文件中,数据管理和维护都由程序员完成。后来发展出树形结构和网状结构的数据库,但都存在着难以扩展和维护的问题。直到七十年代,关系数据库理论的提出,以表格形式组织数据,数据之间存在关联关系,具有了良好......
  • MySQL 存储过程&触发器&事务
    存储过程概念存储过程(StoredProcedure),是为了完成特定功能的SQL语句集。优点存储过程可以理解为shell脚本这类型的命令集输出工具,但是在底层,存储过程拥有更多的优点:语言的灵活性跟功能性更强,在原有基础之上可以插入控制语句、循环语句等让SQL语句的功能更强,能够完成更复杂的......
  • mysql查询某张表数据量
    SELECTtable_schema,table_nameAS'name',table_rowsAS'rows',concat(round(DATA_LENGTH/1024/1024,2),'MB')ASALL_DATA,concat(round(INDEX_LENGTH/1024/1024,2),'MB')ASALL_INDEX,......
  • MySQL学习日志十四,数据库的备份
    数据库备份必要性1.保证重要数据不丢失2.数据转移3.MySQL数据库备份方法mysqldump备份工具1.数据库管理工具,如SQLyog2.直接拷贝数据库文件和相关配置文件3.mysqldump客户端作用:转储数据库搜集数据库进行备份将数据转移到另一个SQL服务器,不一定是MySQL服务器--导......
  • Shell中的if语法详解
    if语法if[condition1];thencommand1elif[condition2];thencommand2elsecommand3fiif判断条件文件/目录判断常用判断[-aFILE]如果FILE存在则为真。[-dFILE]如果FILE存在且是一个目录则返回为真。[-eFILE]如果指定的文件或目录存......