mysql手动事务

news2025/5/30 15:47:57

目录 🚀🚀

简要

手动事务使用案例 

事务的特性 

事务的隔离级别

脏读

不可重复读

幻读

查看事务隔离级别 

设置隔离级别


🫡🫡

简要

mysq事务是自动提交的, 例如insert, update语句等

如下:

想要手动设置mysql事务就需要使用如下语句:

-- 关闭自动提交
set autocommit = 0;

autocommit默认值为1, 也就是默认开启自动事务 

手动事务使用案例 

创建表格

create database if not exists db_transacton;
user db_transaction;

-- 创建用户表
create table userinfo(
    id int primary key,
    name varchar(20),
    money double
);

 插入数据:

insert into userinfo values(1,'zhangsan',1000);
insert into userinfo values(2,'lisi',1000);

设置手动提交事务:

set autocommit = 0;

在设置手动事务之前可以先查看autocommit的状态:

select @@autocommit;

-- 结果如下:

 结果为1相当于开启了自动提交.

模拟账户转账:

begin; -- 首先要开启事务
update userinfo set money = money - 200 where id = 1; -- id == 1代表zhangsan
update userinfo set money = money + 200 where id = 2; -- id == 2代表lisi 

-- 以下两个操作只能选择一个, 要么提交, 要么回滚
-- 执行完毕之后, 提交事务
commit;

-- 回滚事务
rollback

提交事务之后. 那么就相当于zhangsan向lisi转账成功, 回滚操作就相当于 提交的事务出现了问题,被重置, zhangshan和lisi都回到了交易之前的状态.

事务的特性 

  • 原子性: 也就是事务开启之后, 之后的所有操作要么完成要么不完成, 就例如转账的时候, 涉及到一个人的账户减少, 另外一个人的账户增加, 那么这两个操作, 要么全部完成, 要么全部失败, 全部失败也就是执行了回滚操作, 让一个行为执行, 另外一个行为无法执行的情况重置到最开始的情况, 也就是两个行为都没发生的情况. 要么就两个行为都成功, 然后提交事务
  • 一致性:这里的一致性可以理解为事务操作之后数据的正确性, 就例如一个人向另外一个人转账, 不可能是转账的那个人转出去500, 收账的人到账600吧? 这不符合数据库的正确性, 所以事务操作应该保证在执行事务的前后, 系统数据的正确性
  • 隔离性: 这个事物在操作的过程中, 有可能收到其他事务的干扰, 例如有一个人向收账人转账, 收账人又对其账户进行取款, 那么转账这个行为就是取款这个操作看不见的. 我有1000大洋, 我向别人转账的时候, 分两步, 一步是我的扣200, 另外一步是别人的账户加200, 提交事务后那我的账户就是800,但是这个时候如果另外一个给我转账的事务也在进行, 给我转了500块, 但是给我转账的事务是先提交的, 这个时候我的账户就是1500, 然后再提交我给别人转账的事务, 那么就将我的账户余额修改为了800, 那么我不亏大发了. 所以应该设置隔离, 让这两个事务尽量互不干扰.
  • 持久性: 事务一旦提交, 其结果就是数据库被修改, 数据就会在本地数据库进行存储或者修改, 本地磁盘的操作是永久的. 除非下次继续修改此磁盘.

事务的隔离级别

        Isolate, 顾名思义就是将事务与另外一个事物隔离开, 为什么要隔离开呢? 如果一个事物正在操作的数据也被另外一个事务修改了, 最后执行结果可能无法达到预期, 如果没有隔离这两个事务, 那么后面还会导致很多问题出现.

        这张图,  越往下面, 也就是越靠近序列化, 那么他的隔离级别就越高, 反之就越低, mysql的隔离级别默认是可重复度

        下面我们探究一个这四个事务隔离级别的作用:

  • 读未提交( Read uncommitted )

        一个事务可以读取另一个未提交事务的数据,最低级别,任何情况都无法保证,会造成脏读问题.

  • 读已提交(Read committed)

        一个事务要等另一个事务提交后才能读取数据,可避免脏读的发生,会造成不可重复读 

  • 可重复读(Repeatable read)

            就是在开始读取数据(事务开启)时,不再允许修改操作,可避免脏读、不可重复读的发生但是会造成幻读。 
  • 串行(Serializable)
            是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用 

下面来分析一下什么叫做脏读, 不可重复读, 幻读!!  

脏读

        脏读又称无效数据的读出,是指在数据库访问中,事务T1将某一值修改,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改,这就导致了T2所读取到的数据是无效的,值得注意的是,脏读一般是针对于update操作的.

        一个事务正在访问数据, 并且对数据做出了修改, 但是这种修改并没有提交到数据库中去, 也就是虽然修改了数据库的值, 但是并未提交事务, 没有提交事务就代表这个事物随时可能因为出现问题而回滚, 此外另外一个事务也访问这个数据, 然后使用了这个数据, 但是这个数据并未随着事务提交,而事后这个事务因为某些原因写入了错误的值而回滚, 这个时候另外一个事物读取到了这个错误的数据, 也就是脏数据, 依据这个脏数据做出的行为是不正确的. 他很有可能破坏事物的一致性. 那么这个事务读取这个错误的数据的行为就叫做脏读.

不可重复读

        不可重复读,是指在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。

        在一个事务内, 多次访问同一个数据, 但是同时另外一个事物也在访问同一数据并且要修改这个数据, 而且这个修改操作是穿插在这个事务多次访问之间的, 由于别的事务的修改, 那么会让第一个事务多次读取可能会存在读到的数据不一样的情况, 这样就发生了一个事务多次读取同一个数据, 但是读取到的结果是不一样的情况, 因此称为不可重复读.

幻读

        指当事务不是独立执行时发生的一种现象.

        例如, 事务T1对一个表中的数据进行了修改, 这个修改操作设计表中的全部数据行, 同时第二个事务T2也修改这个表中的数据, 这种修改时向表中插入一行新数据, 那么以后就会发生: 操作事务T1的用户发现表中还存在没有修改的数据行, 就好像发生了幻觉一样. 

        解决 幻读, 一般的方法是增加范围锁rangeS, 锁定检索范围为只读, 这样就避免了幻读.

查看事务隔离级别 

show variables like '%isolation%'

 

其中Variable_name = transaction_isolation 的value值为 Repeatable-read, 也就是可重复读.

设置隔离级别

-- 设置读未提交
set session transaction isolation level read uncommitted;

-- 设置读已提交
set session transaction isolation level read committed;

-- 设置可重复读
set session transaction isolation level repeatable read;

-- 设置串行化
set session transaction isolation level serializable;



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1278797.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SmartSoftHelp8,Web前端性能提升,js,css,html 优化压缩工具

Web前端js,css,html 优化压缩工具 提高web 前端性能,访问速度优化专业工具 CSS,js,html 单文件,多文件 单个,批量压缩优化 web前端优化:减少空格,体积压缩&#xff0…

一文通关物理机Ubuntu22.04融合部署OpenStack

前言 因为博主笔记本是amd的,就最近搞了个小主机,就想装个云平台玩玩,搞了三四天才正儿八经弄完,摸了一大堆错误出来,在文章前面我会将这些需要注意的点列举出来。 环境 物理环境: i5 12450H 32G内存 无线…

Windows微软常用运行库合集2023

微软常用运行库合集适用于Windows系统的运行库合集包,基于微软官方的运行库而制作的,包括了常用的vb,vc2005/2008/2010/2012/2013/2017/2019/2005-2022,Microsoft Universal C Runtime,VS 2010 Tools For Office Runti…

实用工具网站合集值得收藏![搜嗖工具箱]

最近一段时间有点忙,一直没有更新在此给大家说声抱歉哈,有些小伙伴儿私信说想要用到的工具,茶壶儿也会尽可能满足大家!今天我们要分享的工具主要有以下几款,我们来一起看一下吧? 一帧秒创 https://aigc.y…

ctfhub技能树_web_web前置技能_HTTP

目录 一、HTTP协议 1.1、请求方式 1.2、302跳转 1.3、Cookie 1.4、基础认证 1.5、响应包源代码 一、HTTP协议 1.1、请求方式 注:HTTP协议中定义了八种请求方法。这八种都有:1、OPTIONS :返回服务器针对特定资源所支持的HTTP请求方法…

jsp 管理员登录界面与登录验证

验证分两种情况 &#xff0c;成功&#xff0c;进入管理员页&#xff0c;可以看信息和删记录 失败&#xff0c;直接给出登录失败&#xff0c;然后重新登录 login.jsp <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF…

基于51单片机控制恒压供水系统设计

**单片机设计介绍&#xff0c;基于51单片机的篮球计分器设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 设计一个基于51单片机控制的恒压供水系统是一个复杂的工程&#xff0c;涉及到硬件设计和软件编程等多个方面。以下是一…

TypeScript编程语言学习,为学习HarmonyOS开发做准备

1. 编程语言 ArkTS是HarmonyOS优选的应用开发语言&#xff0c;它在TypeScript&#xff08;TS&#xff09;的基础上&#xff0c;匹配ArkUI扩展&#xff0c;扩展了声明式UI、状态管理等相应的能力。 JavaScript&#xff08;JS&#xff09;&#xff0c;使用在Web应用开发&#xf…

MacOS qemu运行loongarch linux

本文章参考了 https://github.com/LeisureLinux/bilibili/blob/master/scripts/qemu-busybox.sh#L205 windows qemu安装飞腾Aarch64 Loongarch64 操作系统 亲测_qemu安装arm系统-CSDN博客 https://www.cnblogs.com/missed-forest/p/17667862.html 1. 安装qemu brew instal…

在linux服上部署vue+springboot+nginx项目

一、环境准备 1、安装winscp便于可视化操作linux&#xff1a;winscp安装及关联putty使用_putty.exe没有找到_cherishSpring的博客-CSDN博客 2、安装jdk&#xff1a;linux系统安装jdk-CSDN博客 3、安装mysql&#xff1a;Linux7安装mysql数据库以及navicat远程连接mysql-CSDN博…

opencv知识库:利用cv2.resize()函数进行图像缩放

引言 在numpy知识库&#xff1a;深入理解numpy.resize函数和数组的resize方法中&#xff0c;小编较为详细地探讨了numpy的resize函数背后的机理。从结果来看&#xff0c;numpy.resize函数并不适合对图像进行缩放操作。而opencv中的resize函数虽然和numpy的resize函数同名&…

Hdoop学习笔记(HDP)-Part.19 安装Kafka

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

《功能磁共振多变量模式分析中空间分辨率对解码精度的影响》论文阅读

《The effect of spatial resolution on decoding accuracy in fMRI multivariate pattern analysis》 文章目录 一、简介论文的基本信息摘要 二、论文主要内容语音刺激的解码任务多变量模式分析&#xff08;MVPA&#xff09;K空间 空间分辨率和平滑对MVPA的影响平滑的具体过程…

SpringBoot+SSM项目实战 苍穹外卖(2)

继续上一节的内容&#xff0c;本节完成新增员工、员工分页查询、启用禁用员工账号、编辑员工、导入分类模块功能代码。 目录 新增员工(完整流程分为以下五个部分)需求分析和设计代码开发功能测试代码完善 (ThreadLocal 线程局部变量)代码提交 员工分页查询代码完善 扩展Spring …

【LeetCode刷题笔记】103. 二叉树的锯齿形层序遍历

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多算法知识专栏&#xff1a;算法分析&#x1f525; 给大家跳段街舞感谢…

【数据结构】 堆排序与TopK问题详解

在学习完堆的创建后&#xff0c;就轮到了标题的两个问题 这两个问题在实际生活中会有比较强的实际问题解决能力 先分别解释一下 堆排序&#xff1a; 运用堆的思想进行排序&#xff0c;时间复杂度为O(NlogN)TopK&#xff1a; 从一大堆数据中选择K个最大或最小的数据&#xff0c…

oj赛氪练习题

数组调整 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt();int k scanner.nextInt();int[] arr new int[n];for (int i 0; i < n; i) {arr[i] scanner.nextIn…

充电桩自检流程

1、常规自检流程介绍 充电桩自检流程通常包括以下几个方面&#xff1a; 外观检查&#xff1a;检查充电桩外观是否完好&#xff0c;无损坏、严重污染等问题。连接检查&#xff1a;检查充电桩与电源的连接是否牢固&#xff0c;线缆是否完整无损。安全性检查&#xff1a;检查充电…

750mA Linear Charger with Power Path Management

一、General Description YHM2711 is a highly integrated, single-cell Li-ion battery charger with system power path management for space-limited portable applications. The full charger function features Trickle-charge, constant current fast charge and const…

Upsert 及冲突(GORM)

GORM支持了数据库的upsert操作 upsert操作对于插入一条数据而言的&#xff0c;如果插入数据之前&#xff0c;没有这条数据&#xff0c;则会插入该条数据&#xff1b;如果插入数据之前就存在这条数据&#xff08;索引值&#xff09;&#xff0c;就更新这条记录。 创建结构体 …