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

MySQL--》解析事务从隔离级别到死锁处理

目录

初识事务

事务特性

事务并发

事务隔离


初识事务

事务:是一组操作的集合,它是不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功要么同时失败,例如当进行银行转账的时候,一旦转账的过程中发送了异常,则会取消此次转账并进行操作回滚,回到转账之前的状态:

要知道MySQL的事务默认是自动提交的,也就是说当执行一条DML语句的时候,MySQL会立即隐式的提交事务,那么如果出现数据操作异常的情况,如何对事务进行精确把控呢,这里有两种方式:

手动提交:因为MySQL的事务是默认提交的,我们可以执行select @@autocommit语句查看当前事务的提交方式,如果是1就是自动提交,如果是0就是手动提交,如果我们向设置手动提交的话直接执行如下语句进行事务提交方式的切换即可,如下所示:

具体的事务操作命令主要有以下几行:

-- 查看/设置事务提交方式
select @@autocommit;
set @@autocommit = 0;

-- 提交事务
commit;

-- 回滚事务
rollback;

接下来我们创建一个账户表进行举例,执行如下语句:

-- 数据准备
create table account (
    id int auto_increment primary key comment '主键ID',
    name varchar(20) not null comment '用户名',
    money int not null comment '余额'
) comment '账户表';
insert into account (id, name, money) values
    (null, '张三', 2000),
    (null, '李四', 2000);

如下当我们设置手动提交事务之后,语句执行报错直接回滚即可,即使语句执行没错也必须手动提交事务,数据才会真正更新到数据库当中,如下所示:

控制事务:我们不修改MySQL底层自动提交事务的方式,而是通过语句来控制事务的提交与否,如下所示:

-- 开始事务
start transaction 或 begin;
-- 提交事务
commit;
-- 回滚事务
rollback;

事务特性

事务主要分为以下这个特性:

原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。

一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。

这两种特性就是说当执行操作的时候要不成功要不失败,成功和失败的状态必须保持一致,成功状态下就是执行操作改变数据的应有的情况,失败则不改变数据库原有的情况:

隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。

事务之间是相互独立的,两个事务不会因为同时操作就互相影响:

持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

事务一旦提交就会提交到数据库,数据库就会修改对应磁盘中的数据,使得数据能够永久保存:

事务并发

事务并发指的啊A事务和B事务它们两个在同时操作某一个数据库,甚至于某一张表的时候所引发的一些问题,下面事务并发所产生的一些问题,如下所示:

问题描述
脏读一个事务读到另一个事务还没有提交的数据
不可重复读一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读
幻读一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时又发现这行数据已经存在,好像出现了 “幻影”

脏读:从下图可以看出当事务A更新数据,但是还没有提交事务时就被事务B读取了,此时就称脏读:

不可重复读:从下图可以看出当事务A读完数据库数据的时候,被事务B更新了数据,然后事务A执行了第二次读取数据时,发现与上一次读取的数据不同,此时就称不可重复读:

幻读:从下图库看出当事务A查询id为1的时候没有查询到,此时突然被事务B并发插入了一条id为1的数据,然后事务A往数据库中插入id为1的数据发现此时插入不上,因为其已经存在了id为1的数据导致插入报错,此时事务A又执行了查询语句发现又查询不到,因为之前已经执行过一次了,是不可重复读的,此时就称之为幻读:

事务隔离

事务隔离就是为了解决事务并发所产生的问题的,事务的隔离级别主要分为以下几种,这四种隔离级别从上到下隔离级别越来越高,Serializable的隔离级别最高但是其性能是最差的,隔离级别越高性能越差,隔离级别越低性能越高,如下:

隔离级别脏读不可重复读幻读
Read uncommitted(读,未提交)
Read committed(读,已提交)× 
Repeatable Read(默认,可重复读)× × 
Serializable(串行化)× × × 

我们在业务当中去选择隔离级别的时候既要去权衡数据的安全性,又要去权衡数据库的并发性能,接下来讲解如何查看及设置事务的隔离级别,如下所示:

-- 查看事务隔离级别
select @@transaction_isolation;
-- 设置事务隔离级别
set [session | global] transaction isolation level {read uncommitted | read committed | repeatable read | serializable}


http://www.kler.cn/a/441521.html

相关文章:

  • 机器学习-使用梯度下降最小化均方误差
  • 时序数据库的使用场景
  • JAVA:Spring Boot 实现责任链模式处理订单流程的技术指南
  • rocketmq基本架构
  • 无人机在城市执法监管中的应用:技术革新与监管挑战
  • dp 凸优化
  • Redis在库存里的应用
  • Python中工具脚本在本地共享给不同项目
  • 【C++】小乐乐求和问题的高效求解与算法对比分析
  • 深入探讨HTML页面中CSS的加载顺序
  • 大数据-179 Elasticsearch - 原理剖析 倒排索引与读写流程
  • 远程控制电脑技术让我们的生活更加简化
  • 期末复习-计算机网络应用题
  • ElementUI中el-dropdown-item点击事件无效
  • 《Vue进阶教程》第十四课:改进桶结构
  • 基于微信小程序的小区疫情防控ssm+论文源码调试讲解
  • 【RK3588 Linux 5.x 内核编程】-内核中断与SoftIRQ
  • 常见排序算法总结 (五) - 堆排序与堆操作
  • 谷歌推出 AI 编码助手 “Jules”,自动修复软件漏洞加速开发
  • linux中的权限简单总结
  • 蓝桥杯刷题——day3
  • ElasticSearch的自动补全功能(拼音分词器、自定义分词器、DSL实现自动补全查询、RestAPI实现自动补全查询)
  • npm、yarn、pnpm 设置最新国内镜像源(附官方镜像源和最新阿里源)
  • vue下载node包,前端编译报错 ‘ ./node modules/ml-matrix/src/symmetricMatrix.js‘
  • 基于Spring Boot的小区车辆管理系统
  • 如何用重构解锁高效 Vue 开发之路