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

11.事务

在mysql中,有很多场景都是高并发去访问数据库,然而当并发访问就会导致:A正在处理某个值的状态时,B可能也去访问这个值,这就可能会导致出现错误。
因此,在mysql中进行CURD操作,需要满足以下属性:
访问操作得是原子的(原子性)、并发操作不能互相被影响(隔离性)、完成操作后得永久有效(持久性)、操作前和操作后都得有一定的状态且符合规则。

什么是mysql中的事务?
例子:当银行中需要完成转账时,A的钱减少后,B的钱需要增加。这很明显,一个sql语句完成不了,得两条语句,因此站在上层,将这两条语句看作一个整体为DML语句,这就是事务。这些组成DML语句的sql语句,都需要具有逻辑相关性。只有innodb支持事务。

事务是为了让上层的使用更加方便才产生的。

一个 MySQL 数据库,不止一个事务在运行,同一时刻,甚至有大量的请求被包装成事务,在向 MySQL 服务器发起事务处理请求。而每条事务至少一条 SQL或很多 SQL ,这样如果都访问同样的表数据,在不加保护的情况,就绝对会出现问题。甚至因为事务由多条 SQL 构成,那么也会存在执行到一半出错或者不想再执行的情况,那么已经执行的怎么办呢?因此就需要进行处理使他不要出现这些问题。

事务的属性:
原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)这四大属性称为ACID
原子性:要么完成,要么不完成。如果执行过程处理出问题了,数据就回滚到刚开始的状态。
隔离性:因为可以并发访问,隔离性就可以保证多个事务并发执行时由于交叉执行导致的数据不一致问题。
持久性:事务处理完成后,修改就是永久的。
一致性:事务的开始和结束后,库的完整性不会变。表示写入的数据必须完全符合所有的预设规则。
在mysql中,它不会专门去完成一致性,而是因为在保证了原子性、隔离性和持久性的情况下,在技术上就会保证完成了一致性。

事务的提交方式:
事务是程序员写的一套东西提交给mysql,在mysql中只有engines=innodb模式才支持事务。
事务的提交方式有两种,一种自动,一种手动。
show variables like ‘autocommit’; - - - 查看事务的提交方式
set autocommit=0; - - - 设置为不能够自动提交
set autocommit=1; - - - 可以自动提交

为了研究事务的并发情况下的场景,需要将事务隔离级别设置成读未提交- - - 设置 全局 事务 隔离 等级 读未提交
set global transaction isolation level read uncommitted
打开两个终端的mysql,模拟并发场景。

事务的启动、提交、回滚操作:
启动:start transaction; 或者 begin;
提交:commit;
回滚:rollback; - - - 直接回滚到最开始
回滚:savepoint s1; - - - 设置保存点s1,roolback to s1; - - - 回滚到 s1保存点处。
事务提交了就无法回滚,只有在事务运行期间可以回滚。
测试:只有当隔离设置成读未提交- - -read uncommitted 才能看见实验效果:
在这里插入图片描述

事务运行中,如果没有提交事务,mysql崩溃掉,则事务中的更改表的操作都会消失,相当于回滚到最开始。如果提交后mysql崩溃掉则不影响。
事务的开启,如果是手动 begin 或者 start transaction 开启的,那么在事务中进行的操作就必须手动 commit 提交,设置autocommit=0/1 不会影响。也就是说如果 begin开启,则说明你就是手动。
如果autocommit=0,关闭,那么不手动打开事务的情况下,直接进行操作的数据如果遇到mysql的异常崩溃,则会恢复操作之前原有的数据。

总结:
只要输入begin或者start transaction,事务便必须要通过commit提交,才会持久化,与是否设置set autocommit无关。
事务可以手动回滚,同时,当操作异常,mysql会自动回滚
对于 innodb 每一条 SQL 语言都默认封装成事务,自动提交。
从上面的例子,我们能看到事务本身的原子性(回滚rollback),持久性(提交commit)

事务隔离:
运行中的事务,隔离是必要的,为了不会出现互相干扰。根据隔离影响程度不同,隔离级别就会不同。

隔离级别:
读未提交[read uncommitted]:最低级别,相当于没有任何隔离,所有事物可以看到其他事务没有提交的执行结果,测试用的就是这个。太简单。
读提交[read committed]:大多数库默认的级别,但mysql不是,事务只能看到其他事务已经提交所做的改变,但该方法会引起不可重复读。就是说多次select 可能看见不同的结果。
可重复读[repeatable read]:mysql的默认级别,事务在执行中,多次读取操作会看到同样的数据。
串行化[serializable]:最高隔离级别,强制事务排序按顺序执行,在每个读数据加共享锁,使不可能出现冲突,解决幻读问题,但是会造成超时或者锁竞争。太极端。

隔离级别的设置:
select @@global.tx_isolation - - - 查看全局隔离级别
select @@tx_isolation; - - - 查看本次会话的隔离级别
set global transaction isolation level 级别 - - - 设置全局隔离级别
set session transaction isolation level 级别 - - - 设置本次会话的隔离级别
会话的隔离级别会利用默认的全局隔离级别进行初始化
如果修改会话的隔离级别不影响全局
如果设置全局后,不重启mysql,本次会话的隔离级别也就是更改前的,因为会话隔离级别只有在进入mysql的时候会根据全局隔离级别去设置。因此更改全局后要想使用这个级别得重启mysql。

读未提交:一个事务运行中读到另一个事务正在更新或其他操作且并未提交的结果,这种现象叫做脏读。

读提交:一个正在运行中的事务A,在刚开始读未更改的表,然后另一个正在运行的事务B对表进行修改后且进行了提交,那么A事务在没有提交的情况下又读到了B修改后的结果,这种现象叫做不可重复读(因为出现了两次不同的表数据)。因为要满足事务的操作是原子的,因此不能让正在运行中的事务读到修改前和修改后的数据表。需要保证只有在事务A也结束后才能读到修改后的表数据。
在这里插入图片描述

可重复读:在有些库中,可重复读的条件下,如果进行insert操作,另一个事务无法屏蔽掉insert的数据,其他的操作都会可重复读,只有insert可能会出问题,这种情况叫幻读。然而,在mysql 这个库不存在幻读的情况。

串行化:让所有的事务进行串行化,而不是sql语句串行化。他是一个安全的方案,但不是一个高效的方法。串行化对不同事物的查看不会拦截,都能查,但是在B事务存在的情况下,A事务对表的修改不会成功,只有B事务结束后才能够进行修改。

一致性:
事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态。当数据库只包含事务成功提交的结果时,数据库处于一致性状态。如果系统运行发生中断,某个事务尚未完成而被迫中断,而改未完成的事务对数据库所做的修改已被写入数据库,此时数据库就处于一种不正确(不一致)的状态。但是一致性还是要用户业务逻辑做支撑,也就是,一致性,是由用户决定的。而技术上,通过AID保证C

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

相关文章:

  • 【GoLang#1】:Go 语言概述(背景 | 环境配置 | 特点 | 学习)
  • Redis单线程模型(含面试题)
  • pytorch常用函数
  • 【MySQL数据库备份与恢复1】二进制日志,mysqlbinlog
  • Linux Wlan 无线网络驱动开发-scan协议全流程详解
  • 企业安全基石:解锁等保测评的战略价值
  • 循环神经网络--LSTM模型
  • 15.2 DeepSpeed显存优化实战:7B大模型训练资源从84GB压缩到10GB!
  • 11-day08文本匹配
  • Cisco 主模式配置
  • 综合实验(4)
  • 光猫配置DMZ到路由器
  • OSPF多区域介绍
  • 使用 Elastic Observability 监控 Proxmox VE 部署
  • Linux命令基础完结篇
  • 【实时Linux实战系列】基于实时Linux的机器学习应用开发
  • 大模型微调学习笔记(基于讯飞星辰MaaS速学版)
  • Java 中 Future 与 Callable 的使用详解
  • pycharm在virtual环境下安装依赖失败的解决方案
  • 面试150 搜索二维矩阵
  • Mirauge3D 赋能:全自动建模,让城市规划与建筑设计拥有高分辨率实景三维模型
  • OpenHands:Manus 最强开源平替——本地部署与实战指南
  • KTH5791——3D 霍尔位置传感器--鼠标滚轮专用芯片
  • 【Ollama】open-webui部署模型
  • 高通平台基线升级时,从Android 13升级到Android 15遇到的selinux权限不生效问题分析
  • 【矩阵专题】Leetcode54.螺旋矩阵
  • Linux基础服务(NTP/Chrony)
  • 红队视角:实战渗透测试中漏洞利用的进阶技巧与防御
  • Python Playwright库详解:从入门到实战
  • 虚拟电厂——解读69页 2024虚拟电厂售电业务及共享储能等新型业态趋势【附全文阅读】