当前位置: 首页 > news >正文

数据库造神计划第十九天---事务(2)

 🔥个人主页:寻星探路

🎬作者简介:Java研发方向学习者

📖个人专栏: 、《

⭐️人生格言:没有人生来就会编程,但我生来倔强!!!



目录

 一、事务的隔离性和隔离级别

1、什么是隔离性

2、隔离级别

3、查看和设置隔离级别

4、不同隔离级别存在的问题

4.1 READUNCOMMITTED-读未提交与脏读

4.1.1存在问题

4.1.2问题重现

4.2 READ  COMMITTED-读已提交与不可重复读

4.2.1存在问题

6.4.2问题重现

4.3REPEATABLE  READ-可重复读与幻读

4.3.1存在问题

4.3.2 问题重现

4.4SERIALIZABLE-串行化

5、不同隔离级别的性能与安全

二、简单总结

1、事务的ACTD特性

2、事务

3、事物的隔离性和隔离级别


续接上一话:

 一、事务的隔离性和隔离级别

        对于服务器来说,并发是一个非常关键的话题。(并发执行容易出问题,顾此失彼)

        对于数据库服务器来说
提高并发性,提高数据库处理事务的效率,但是对于数据的准确性就能造成负面影响~~
降低并发性,降低了数据库处理事务的效率,但是对于数据的准确性能够提高的~~

1、什么是隔离性

        MySQL服务可以同时被多个客户端访问,每个客户端执行的DML语句以事务为基本单位,那么不同的客户端在对同⼀张表中的同⼀条数据进行修改的时候就可能出现相互影响的情况,为了保证不同的事务之间在执行的过程中不受影响,那么事务之间就需要要相互隔离,这种特性就是隔离性。

2、隔离级别

        事务具有隔离性,那么如何实现事务之间的隔离?隔离到什么程度?如何保证数据安全的同时也要兼顾性能?这都是要思考的问题。

        事务间不同程度的隔离,称为事务的隔离级别;不同的隔离级别在性能和安全方面做了取舍,有的隔离级别注重并发性,有的注重安全性,有的则是并发和安全适中;在MySQL 的 InnoDB引擎中事务的隔离级别有四种,分别是:

        READ  UNCOMMITTED,读未提交
        READ  COMMITTED,读已提交
        REPEATABLE  READ,可重复读(默认)
        SERIALIZABLE,串行化

3、查看和设置隔离级别

        事务的隔离级别分为全局作用域和会话作用域,查看不同作用域事务的隔离级别,可以使用以下的方式:

# 全局作⽤域
SELECT @@GLOBAL.transaction_isolation;
# 会话作⽤域
SELECT @@SESSION.transaction_isolation;
# 可以看到默认的事务隔离级别是REPEATABLE-READ(可重复读)

        设置事务的隔离级别和访问模式,可以使用以下语法:

# 通过GLOBAL|SESSION分别指定不同作⽤域的事务隔离级别
SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL level|access_mode;
# 隔离级别
level: {REPEATABLE READ   # 可重复读| READ COMMITTED    # 读已提交| READ UNCOMMITTED  # 读未提交| SERIALIZABLE      #串⾏化
}
# 访问模式
access_mode: {READ WRITE       #表⽰事务可以对数据进⾏读写| READ ONLY        #表⽰事务是只读,不能对数据进⾏读写
}# ⽰例
# 设置全局事务隔离级别为串⾏化,后续所有事务⽣效,不影响当前事务
SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;
#设置会话事务隔离级别为串⾏化,当前会话后续的所有事务⽣效,不影响当前事务,可以在任何时候执⾏
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
# 如果不指定任何作⽤域,设置只针对下⼀个事务,随后的事务恢复之前的隔离级别
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
# ⽅式⼀
SET GLOBAL transaction_isolation = 'SERIALIZABLE';
# 注意使⽤SET语法时有空格要⽤"-"代替
SET SESSION transaction_isolation = 'REPEATABLE-READ';  
# ⽅式⼆
SET @@GLOBAL.transaction_isolation='SERIALIZABLE';
# 注意使⽤SET语法时有空格要⽤"-"代替
SET @@SESSION.transaction_isolation='REPEATABLE-READ';

4、不同隔离级别存在的问题

4.1 READUNCOMMITTED-读未提交与脏读

4.1.1存在问题

        出现在事务的 READ  UNCOMMITTED 隔离级别下,由于在读取数据时不做任何限制,所以并发性能很高,但是会出现大量的数据安全问题,比如在事务A中执行了⼀条 INSERT 语句,在没有执行 COMMIT 的情况下,会在事务B中被读取到,此时如果事务A执行回滚操作,那么事务B中读取到事务A写入的数据将没有意义,我们把这个理象叫做 " 脏读 " 。

4.1.2问题重现

        在⼀个客户端A中先设置全局事务隔离级别为 READ  UNCOMMITTED 读未提交:

# 设置隔离级别为READ UNCOMMITTED读未提交
SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;# 查看设置是否⽣效
SELECT @@GLOBAL.transaction_isolation;

        打开另⼀个客户端B并确认隔离级别

# 查看设置是否⽣效
SELECT @@GLOBAL.transaction_isolation;

        在不同的客户端中执行事务

        由于 READ UNCOMMITTED 读未提交会出现"脏读"现象,在正常的业务中出现这种问题会产生非常危重后果,所以正常情况下应该避免使用READ  UNCOMMITTED读未提交这种的隔离级别。

4.2 READ  COMMITTED-读已提交与不可重复读

4.2.1存在问题

        为了解决脏读问题,可以把事务的隔离级别设置为 READ COMMITTED ,这时事务只能读到了其他事务提交之后的数据,但会出现不可重复读的问题,如事务A先对某条数据进行了查询,之后事务B对这条数据进行了修改,并且提交( COMMIT )事务,事务A再对这条数据进行查询时,得到了事务B修改之后的结果,这导致了事务A在同⼀个事务中以相同的条件查询得到了不同的值,这个现象要"不可重复读"。

6.4.2问题重现

        在⼀个客户端A中先设置全局事务隔离级别为 READ COMMITTED 读未提交:

# 设置隔离级别为READ COMMITTED读未提交
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;# 查看设置是否⽣效
SELECT @@GLOBAL.transaction_isolation;

        打开另⼀个客户端B并确认隔离级别

# 查看设置是否⽣效
SELECT @@GLOBAL.transaction_isolation;

        在不同的客户端中执行事务

4.3REPEATABLE  READ-可重复读与幻读

4.3.1存在问题

        为了解决不可重复读问题,可以把事务的隔离级别设置为 REPEATABLE READ ,这时同⼀个事务中读取的数据在任何时候都是相同的结果,但还会出现⼀个问题,事务A查询了⼀个区间的记录得到结果集A,事务B向这个区间的间隙中写入了⼀条记录并提交,事务A再查询这个区间的结果集时会查到事务B新写入的记录得到结果集B,两次查询的结果集不⼀致,这个现象就是"幻读"。

MySQL 的InnoDB存储引擎使用了Next-Key锁解决了大部分幻读问题

4.3.2 问题重现

        由于 REPEATABLE READ 隔离级别默认使用了 Next-Key 锁,为了重现幻读问量,我们把隔离级回退到更新时只加了排他锁的 READ COMMITTED .

# 设置隔离级别为READ COMMITTED读未提交
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;# 查看设置是否⽣效
SELECT @@GLOBAL.transaction_isolation;

        在不同的客户端中执行事务

        把隔离级别设置为REPEATABLE-READ后,在ID的间隙中插入新数据观察现象,比如插入ID=4的记录

4.4SERIALIZABLE-串行化

        进⼀步提升事务的隔离级别到 SERIALIZABLE ,此时所有事务串行执行,可以解决所有并发中的安全问题。

5、不同隔离级别的性能与安全

二、简单总结

1、事务的ACTD特性

2、事务

3、事物的隔离性和隔离级别

http://www.dtcms.com/a/393653.html

相关文章:

  • Python到剪映草稿生成及导出工具,构建全自动化视频剪辑/混剪流水线
  • WordPress给指定分类文章添加一个自动化高亮(一键复制)功能
  • 5分钟使用Dify实现《射雕英雄传》问答智能体Agent
  • 3. 认识 const
  • 云原生 vs 传统部署
  • 2.1、机器学习-模型评估指标与参数调优
  • 设计模式(C++)详解—享元模式(2)
  • Linux实用操作以及基础命令
  • 深入理解 Vue 插槽:从基础到高级用法
  • 自动排班系统:劳动力管理新选择
  • Word和WPS文字中设置了倍数行距却没有变化?原因和调整方法
  • 【Linux篇】Linux 初探:历史溯源与常用指令速览
  • 数字孪生及其在能源和新材料等领域内的应用
  • DeepSeek后训练:监督微调策略,开启模型优化新时代
  • 基于规则的专家系统对自然语言处理深层语义分析的影响与启示研究
  • 设计模式学习[19]---单例模式(饿汉式/懒汉式)
  • 基于哈希表与差分前缀和解决撒狗粮问题
  • 基于多设计模式的状态扭转设计:策略模式与责任链模式的实战应用
  • 残差分析:数据驱动下线性模型的“体检师”与优化指南
  • gorm速成
  • 模型和策略:风控体系的“左右手”之争
  • Keil5 5.38版本在使用STLINK时闪退
  • win11 安装 WSL2 Ubuntu 并支持远程 SSH 登录
  • 基分析积分法则
  • 【Linux】网络——HTTP协议,HTTPS加密
  • HarmonyOS动画:属性动画、显示动画、转场动画
  • Redis 持久化机制详解:RDB 与 AOF 原理与实践
  • 【嵌入式协议外设篇】-8×8 点阵屏
  • 【C++:STL】深入详解string类(一):从读文档开始
  • 电商项目实战总结