首页 > 数据库 >MySQL-基础篇 ( 事务:相关 + 操作 + ACID + 并发问题 + 隔离级别 )

MySQL-基础篇 ( 事务:相关 + 操作 + ACID + 并发问题 + 隔离级别 )

时间:2023-08-17 19:47:40浏览次数:44  
标签:事务 隔离 并发 提交 MySQL 操作 ACID

MySQL-基础篇 ( 事务 )

目录

事务简介

  • 事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败
  • 典型案例:银行转账,一方转账减钱时,若是中途出了问题,此方的钱数不会减少,而是回滚到转帐前的状态
  • 默认 MySQL 的事务是自动提交的,也就是说,当执行一条 DML 语句,MySQL 会立即隐式的提交事务
    • 即中途出了问题,可能会导致一方钱数减少了,但另一方钱数没有增加

事务操作

方式一

  • 查看事务提交方式

    • 直接输入语句:SELECT @@autocommit;

    image-20230723175854868

    • 1 表示当前事务是自动提交
  • 设置事务提交方式

    • 设置为手动提交:SET @@autocommit = 0;
  • 提交事务

    • 设置为手动提交后,SQL 语句并不会对数据库进行更改,想要提交到数据库需要在操作的最后执行:COMMIT;
    • 即,如果设置为了手动提交,则往后的所有对数据库的操作都要在执行后再 COMMIT; 才行
  • 回滚事务

    • 设置为手动提交后,当事务中途出现错误,就不要再执行 COMMIT 提交了,而是执行:ROLLBACK; 进行回滚事务
    • 因为在报错前的语句还是都执行完成了,所以要回滚让执行过的恢复到初始状态
  • 代码模拟:

    -- 查看事务提交方式
    SELECT @@AUTOCOMMIT;
    -- 设置事务提交方式,1为自动提交,0为手动提交,该设置只对当前会话有效
    SET @@AUTOCOMMIT = 0;
    
    -- 设置完手动提交后:
    select * from account where name = '张三';
    update account set money = money - 1000 where name = '张三';
    update account set money = money + 1000 where name = '李四';
    commit;
    -- 按照需要回滚事务:ROLLBACK;
    

方式二

  • 开启事务

    • 在语句执行之前先执行:START TRANSACTION;BEGIN;
  • 提交事务

    • 同方式一,成功了就继续执行:COMMIT;
  • 回滚事务

    • 同方式一,失败出错了,就不执行 COMMIT;,而是执行:ROLLBACK;
  • 代码模拟:

    start transaction;
    select * from account where name = '张三';
    update account set money = money - 1000 where name = '张三';
    update account set money = money + 1000 where name = '李四';
    commit;
    -- 按照需要回滚事务:ROLLBACK;
    

事务四大特性 ( ACID )

  • 原子性 ( Atomicity ):事务是一组操作,是不可分割的最小操作单元,要么全部成功,要么全部失败
  • 一致性 ( Consistency ):事务完成时,必须使所有数据都保持一致状态
  • 隔离性 ( Isolation ):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
  • 持久性 ( Durability ):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的
  • 即 ( 以上述转账为例 ):
    • 原子性 —— 转账过程其中一步失败了,整个操作就失败了
    • 一致性 —— 不管事务成与不成,最后总余额数一致
    • 隔离性 —— 若干个并发事务,事务 A 和事务 B 两者执行互不干扰,都是独立环境下进行的
    • 持久性 —— 不管转账成与不成,最后的对数据库的改变是永久的 ( 数据库数据最终是保存、持久化到磁盘中的 —— 各信息都是在 MySQL 文件夹下以某种格式被保存着 )

并发事务问题

  • 多个并发事务在执行的过程中所出现的并发事务问题:
问题 描述
脏读 一个事务读到另一个事务还没提交 ( 操作没完成 ) 的数据
不可重复读 一个事务先后读取同一条记录,但两次读取的数据不同 ( 其他操作在两次读取的中途对记录进行了更改 )
幻读 一个事务按照条件查询数据时,没有对应的数据行,但是在执行插入数据时,又发现这行数据已经存在 ( 数据被其他事务操作了 ),好像出现了 “ 幻影 ”

事务隔离级别

  • 为了解决在多个并发事务执行的过程中所出现的各种并发事务问题
隔离级别 脏读 不可重复读 幻读
Read uncommitted —— 读未提交 Y Y Y
Read committed —— 读已提交 N Y Y
Repeatable Read ( 默认 ) —— 可重复读 N N Y
Serializable —— 串行化 N N N
  • MySQL 默认的隔离级别是 Repeatable Read,而 Orcale 默认的就是 Read committed 了

    • Y 表示会出现,N 表示该问题不会出现
      • 从上到下隔离级别越高,但性能也就越差
        • 即 Read uncommitted 是效率最高的,但安全性是最差的
  • 查看事务隔离级别:SELECT @@TRANSACTION_ISOLATION;

    • MySQL 下:

      image-20230723215126281

  • 设置事务隔离级别:SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE};

    • SESSION 是会话级别,表示只针对当前客户端窗口有效,GLOBAL 表示对所有客户端会话窗口有效
    • 大括号内的就是自行设置的隔离级别,不区分大小写
  • 模拟脏读情况:

    • 可打开两个 cmd 命令行窗口模拟两个客户端,两个并发事务

    • 两个窗口,登录一样的用户,同样执行:

      • mysql> user 数据库;

        set ... level read uncommitted;

        start transaction;

    • A 窗口读两次一个数据,B 窗口在 A 读两次之间进行对此数据的更改,并在 A 读完再 commit;

      • 就会发现 B 还没提交,A 两次的读取就不一样了
    • 紧接着将 A 级别进行更改为 read committed 后,重复上述操作,就会发现 A 两次的读取一样了,只有 B 提交后 A 第三次读取才会查到更改后的数据

  • 而上述情况的 A 的第一、二次读取与第三次读取结果不一致,这就是 " 不可重复读 " 的情况了,只有再升一个隔离等级后,就会发现第一、二、三次结构都一致,只有 A commit; 提交后再第四次查询才会发现有了更改 ( B 提交了的更改 )

  • 最后一种幻读情况就不再演示,即 A 查空 id,B 插此空 id 并提交,就会使得 A 无法再插入却还读不到的 " 幻读 " 问题

    • 提高等级后解决方法就是,A 开启事务查后,B 无法执行任何语句,只有等 A 插、查操作等都完成了,commit; 提交了,B 才能继续执行语句 —— 规避了 " 幻读 "

标签:事务,隔离,并发,提交,MySQL,操作,ACID
From: https://www.cnblogs.com/zhu-ya-zhu/p/17638660.html

相关文章

  • MySQL-基础篇 ( 相关了解 + SQL-DDL )
    MySQL-基础篇(相关了解+SQL-DDL)目录MySQL-基础篇(相关了解+SQL-DDL)认知了解MySQL数据库SQL通用语法分类数据类型数值类型字符串类型日期时间类型DDL数据库操作查询创建删除使用表操作查询创建修改删除数据库图形化界面工具认知了解数据库,DataBase简称DB,是有组......
  • mysql代理、中间件技术
    mysql代理、中间件技术代理简介名词DBproxy数据库中间件功能读写分离:读写分离导致处理速度迅速,一般情况下是主服务器进行写操作而从服务器进行读操作负载均衡支持数据的分片自动路由和聚合本文主要围绕Mycat实现、且在完成MM-SS集群的条件下实验步骤1.配置五台虚拟机......
  • MySQL-进阶篇 ( 存储引擎 + 索引一:结构 + 分类 + 语法 + SQL 性能分析 )
    MySQL-进阶篇(存储引擎+索引一)目录MySQL-进阶篇(存储引擎+索引一)存储引擎MySQL体系结构存储引擎简介存储引擎特点InnoDBMyISAMMemory引擎特点区分存储引擎选择索引索引概述索引结构二叉树B-Tree(B树,多路平衡查找树)B+Tree(B加树)Hash面试思考题索引分类在In......
  • MySQL-基础篇 ( SQL-DML + DQL + DCL )
    MySQL-基础篇(SQL-DML+DQL+DCL)目录MySQL-基础篇(SQL-DML+DQL+DCL)SQLDML添加数据INSERT修改数据UPDATE删除数据DELETEDQL语句编写顺序基本查询条件查询(WHERE)聚合函数(count、max、min、avg、sum)分组函数(GROUPBY)排序查询(ORDERBY)分页查询(......
  • MySQL 8 下载安装过程
    MySQL8安装过程搜索MySQL官网——>点击DOWNLOADS——>MySQLCommunity(GPL)Downloads本文是下载社区版本,商业版本的话点击此页面的MySQLEnterpriseEdition(商业的是有技术支持收费的,本文介绍的是免费的社区版)点击MySQLCommunityServer选择......
  • 【技术积累】MySQL优化及进阶
    MySql优化及进阶一、MySQL体系结构连接层:是一些客户端和链接服务,包含本地sock通信和大多数基于客户端/服务端工具实现的类似于TCP/IP的通信服务层:大多数的核心服务功能,如SQL接口,并完成缓存的查询,SQL的分析和优化,部分内置函数的执行引擎层:负责了MySQL中数据的存储和提取,服......
  • 内网服务器离线编译安装mysql5
    目录一.前言二.关于MySQL三.MySQL安装篇3.1部署环境3.2前期准备工具3.3挂载系统ISO镜像,配置yum源3.4安装mysql编译所需的依赖包3.5源码编译安装mysql5.73.6配置mysql四.MySQL调优篇4.1对MySQL进行安全设置4.2设置MySQL超时时间4.3MySQL配置文件优化参......
  • mysql
    几乎每张业务表都带有一个日期列,用于记录每条记录产生和变更的时间。比如用户表会有一个日期列记录用户注册的时间、用户最后登录的时间。又比如,电商行业中的订单表(核心业务表)会有一个订单产生的时间列,当支付时间超过订单产生的时间,这个订单可能会被系统自动取消。日期类型虽然常......
  • mac m1 docker安装mysql
    1、拉取镜像dockerpullmysql/mysql-server2、启动服务dockerrun--namemysql-docker--restartalways--privileged=true\-p3306:3306\-eMYSQL_ROOT_PASSWORD="root"\-eTZ="Asia/Shanghai"\-d mysql/mysql-server说明:-d:后台运行容器-p:指定容器暴露......
  • mysql数据库DeadLock处理分析
    1.问题复现数据库新建一个test表,里面包含id,和name字段然后分别开两个窗口,分别开启事务,然后updatename字段,不提交,然后查看一下三个表,看是否出现锁表情况innodb_trx        ##当前运行的所有事务innodb_locks     ##当前出现的锁innodb_lock_waits......