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

news/2024/12/16 23:17:32/

目录

初识事务

事务特性

事务并发

事务隔离


初识事务

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

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

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

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

sql">-- 查看/设置事务提交方式
select @@autocommit;
set @@autocommit = 0;-- 提交事务
commit;-- 回滚事务
rollback;

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

sql">-- 数据准备
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底层自动提交事务的方式,而是通过语句来控制事务的提交与否,如下所示:

sql">-- 开始事务
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(串行化)× × × 

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

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


http://www.ppmy.cn/news/1555703.html

相关文章

【论文笔记】Visual Prompt Tuning

🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 基本信息 标题: Visual Prompt Tuning 作者…

python制造一个报错

在Python中,制造一个报错(异常)可以通过多种方式实现。最常见的方法之一是直接引发一个异常。以下是一些例子,展示了如何制造不同类型的报错: 引发ValueError异常: try:# 制造一个 ValueError 异常raise Va…

Vue3之TypeScript的支持

随着前端技术的飞速发展,Vue 3与TypeScript的组合已成为许多开发者的首选技术栈。Vue 3作为Vue.js的最新版本,引入了众多革新性的功能和优化,而TypeScript作为一种强大的静态类型检查语言,其严谨的类型系统和智能代码提示极大地增…

动态规划part03

文章参考来源代码随想录 题目参考来源leetcode 01背包问题 二维: 背包问题: 动规五部曲: 1.确定dp数组以及下标的含义: 其实这里由题目要我们求的就可以推出来了 把下标为0-i的物品装入容量为j的背包最大价值为dp[i][j]。 …

Mac/Windows端长期破解myBase8方法(无需安装火绒)

提醒 不管哪个端,都需要先退出myBase。 Mac 进入用户根目录/Users/c0ny100,即下边是Macintosh HD > 用户 > [你的用户名]这个界面然后按ShiftCommond.,显示隐藏文件。找到.Mybase8.ini文件 打开.Mybase8.ini文件,删除Fir…

机器学习—大语言模型:推动AI新时代的引擎

云边有个稻草人-CSDN博客 目录 引言 一、大语言模型的基本原理 1. 什么是大语言模型? 2. Transformer 架构 3. 模型训练 二、大语言模型的应用场景 1. 文本生成 2. 问答系统 3. 编码助手 4. 多语言翻译 三、大语言模型的最新进展 1. GPT-4 2. 开源模型 …

基于python的一个简单的压力测试(DDoS)脚本

DDoS测试脚本 声明:本文所涉及代码仅供学习使用,任何人利用此造成的一切后果与本人无关 源码 import requests import threading# 目标URL target_url "http://47.121.xxx.xxx/"# 发送请求的函数 def send_request():while True:try:respo…

Reactor 响应式编程(第一篇:Reactor核心)

系列文章目录 Reactor 响应式编程(第一篇:Reactor核心) Reactor 响应式编程(第二篇:Spring Webflux) Reactor 响应式编程(第三篇:R2DBC) Reactor 响应式编程&#xff08…