码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 事务(2)


    目录

    事务的隔离性

    1. 事务和事务之间有4个隔离级别

    1.1 读未提交:read uncommitted(最低的隔离级别)《没有提交就读到了》

    1.2 读已提交:read committed《提交之后才能读到》《二档》

    1.3 可重复读:repeatable read《提交之后也读不到,永远读取的都是刚开启事务时的数据》《三档》

    1.4 序列化/串行化:serializable(最高的隔离级别)

    2. 验证各种隔离级别

    2.1 验证 ---> 读未提交:read uncommited

    2.2 验证 ---> 读已提交:read commited

    2.3 验证 ---> 可重复读:repeatable read

    2.4 验证 ---> 序列化/串行化:serializable


    事务的隔离性

    • A教室和B教室中间有一道墙,这道墙可以很厚,也可以很薄。这就是事务的隔离级别。
    • 这道墙越厚,表示隔离级别就越高。

    1. 事务和事务之间有4个隔离级别



    1.1 读未提交:read uncommitted(最低的隔离级别)《没有提交就读到了》

    什么是读未提交?

    • 事务A可以读取到事务B未提交的数据。

    这种隔离级别存在的问题就是:

    • 脏读现象!(Dirty Read)
    • 我们称读到了脏数据。
    • 这种隔离级别一般都是理论上的,大多数的数据库隔离级别都是二档起步!


    1.2 读已提交:read committed《提交之后才能读到》《二档》

    什么是读已提交?

    • 事务A只能读取到事务B提交之后的数据。

    这种隔离级别解决了什么问题?

    • 解决了脏读的现象。

    这种隔离级别存在什么问题?

    • 不可重复读取数据。

    什么是不可重复读取数据呢?

    • 在事务开启之后,第一次读到的数据是3条,当前事务还没有结束,可能第二次再次读取的时候,读到的数据是4条,3不等于4称为不可重复读取。

    这种隔离级别是比较真实的数据,每一次读到的数据是绝对的真实。oracle数据库默认的隔离级别是:read committed



    1.3 可重复读:repeatable read《提交之后也读不到,永远读取的都是刚开启事务时的数据》《三档》

    什么是可重复读取?

    • 事务A开启之后,不管是多久,每一次在事务A中读取到的数据都是一致的。即使事务B将数据已经修改,并且提交了,事务A读取到的数据还是没有发生改变,这就是可重复读。

    可重复读解决了什么问题?

    • 解决了不可重复读取数据。

    可重复读存在的问题是什么?

    • 可能会出现幻影读。
    • 每一次读取到的数据都是幻象。不够真实!
    • 早晨9点开始开启了事务,只要事务不结束,到晚上9点读到的数据还是和早晨9点时读到的数据一样!读到的是假象。不够绝对的真实。

    mysql中默认的事务隔离级别就是这个!



    1.4 序列化/串行化:serializable(最高的隔离级别)

    • 这是最高隔离级别,效率最低。解决了所有的问题。
    • 这种隔离级别表示事务排队,不能并发!
    • 类似于synchronized,线程同步(事务同步)
    • 每一次读取到的数据都是最真实的,并且效率是最低的。


    2. 验证各种隔离级别

    isolation:隔离

    查看隔离级别:select @@tx_isolation;

    MySQL8.0版本之后:select@@transaction_isolation;

    mysql默认的隔离级别



    2.1 验证 ---> 读未提交:read uncommited

    set global transaction isolation level read uncommitted;

    select @@tx_isolation;

    开启事务A,并且查询表 t_user

    然后开启事务B,接着插入数据,并且没有提交事务

    最后在事务A中可以读取到事务B未提交的数据



    2.2 验证 ---> 读已提交:read commited

    set global transaction isolation level read committed;

    select @@tx_isolation;

    开启事务A,并且查询表 t_user

    然后开启事务B,接着插入数据,并且没有提交事务

    接着在事务A中查询表 t_user 

    然后事务B提交事务

    最后再次在事务A中查询表 t_user 



    2.3 验证 ---> 可重复读:repeatable read

    set global transaction isolation level repeatable read;

    select @@tx_isolation;

    开启事务A

    开启事务B

    在事务A中查询表 t_user 

     

    然后在事务B中接着插入数据,并且提交事务

    最后再次在事务A中查询表 t_user 



    2.4 验证 ---> 序列化/串行化:serializable

    set global transaction isolation level serializable;

    select @@tx_isolation;

    开启事务A

    开启事务B

    在事务A中查询表 t_user ,并且插入数据,但先不提交事务

    在事务B中查询表 t_user,因为事务A未结束,所以查询不了。两个事务同时操作同一张表。

    在事务A中提交事务

    然后在事务B中立即查询出表t_user

     

  • 相关阅读:
    【数据结构与算法】之深入解析“恢复数组”的求解思路与算法示例
    PWN 基础篇 Write Up
    JavaScript 判断是否为数字的几种方式
    Linux常用命令——系统痕迹命令
    数仓工具—Hive源码之SQL解析Antlr入门(7)
    C/C++ 实现动态资源文件释放
    UniPro提高集成能力 让客户专注于交付价值
    记一次flink postgres cdc丢数据
    天津理工大学计算机考研资料汇总
    RK3568-buildroot添加用户应用程序
  • 原文地址:https://blog.csdn.net/weixin_52385232/article/details/126082698
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号