MySQL之事务详解

华子目录

  • 什么是事务
  • 银行转账案例
    • 方式1
    • 方式2
    • 具体操作
  • 事务的四大特性
  • 并发事务问题
    • 脏读
    • 不可重复读
    • 幻读
  • 事务的隔离级别
    • 查看事务隔离级别
    • 设置事务隔离级别
  • session与global的区别

什么是事务

  • 事务(transaction),一个最小的不可再分的工作单元,通常一个事务对应一个完整的业务。例如银行账户转账业务,该业务就是一个最小的工作单元。一个完整的业务需要批量的DML(insert、update、delete)语句共同联合完成
  • 要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成
  • 在这里插入图片描述

银行转账案例

  • 以银行转账为例:账户转账是一个完整的业务,最小的单元,不可再分——也就是说银行账户转账是一个事务

方式1

MySQL默认已经开启自动提交,我们可以通过对应的设置来开启或者关闭自动提交。(默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务)

#查看事务提交方式
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            1 |
+--------------+

#设置事务提交方式
mysql> set @@autocommit=0;   #0为不自动提交(手动提交)
Query OK, 0 rows affected (0.00 sec)

mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            0 |
+--------------+
#提交事务
mysql> commit;
#完成一个事务,一旦事务提交成功 ,就说明具备ACID特性了。
#回滚事务
mysql> rollback;
#将内存中,已执行过的操作,回滚回去

方式2

说明:在5.5 以上的版本,不需要手工begin,只要你执行的是一个DML,会自动在前面加一个begin命令。

#开启事务
mysql> begin;
或
mysql> start transaction;
#提交事务
mysql> commit;
#完成一个事务,一旦事务提交成功 ,就说明具备ACID特性了。
#回滚事务
mysql> rollback;

具体操作

  • 张三给李四转1000元
mysql> select* from account;
+----+--------+-------+
| id | name   | money |
+----+--------+-------+
|  1 | 张三   |  2000 |
|  2 | 李四   |  2000 |
+----+--------+-------+

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update account set money=money-1000 where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> update account set money=money+1000 where id=2;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from account;
+----+--------+-------+
| id | name   | money |
+----+--------+-------+
|  1 | 张三   |  1000 |
|  2 | 李四   |  3000 |
+----+--------+-------+
2 rows in set (0.00 sec)

mysql> rollback;  #回滚
Query OK, 0 rows affected (0.00 sec)

mysql> select * from account;
+----+--------+-------+
| id | name   | money |
+----+--------+-------+
|  1 | 张三   |  2000 |
|  2 | 李四   |  2000 |
+----+--------+-------+
2 rows in set (0.00 sec)

事务的四大特性

事务是由一组SQL语句 组成的逻辑处理单元,它的ACID特性如下:

  • 原子性(Atomicity): 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
  • 一致性(Consistency): 事务必须使数据库从一个一致性状态变换到另外一个一致性状态
  • 隔离性(Isolation): 事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
  • 持久性(Durability): 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

在这里插入图片描述

并发事务问题

脏读

指一个事务读取了另外一个事务未提交的数据。
在这里插入图片描述

  • 事务A在完成第二步后还没有commit,事务B就select了数据库,事务B就拿到了事务A update的数据

不可重复读

一个事务先后读取同一条记录,但两次读取的数据不同
在这里插入图片描述

  • 事务A在第二次select数据库前,事务B就已经update并commit了事务。

幻读

一个事务按条件插询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了“幻影”。
在这里插入图片描述

  • 事务A在第一次select数据库时发现没有数据,在第二次insert前,事务B已经insert并commit了数据,当事务A在insert数据时,发现insert失败(说明已经存在数据),这时事务Aselect时,发现这行数据存在。

事务的隔离级别

为了解决并发事务问题,SQL标准定义了以下几种事务隔离级别
在这里插入图片描述

  • Read uncommitted:最低级别,以上情况均无法保证。(读未提交)
  • Read committed:可避免脏读情况发生(读已提交)。
  • Repeatable read:可避免脏读、不可重复读情况的发生。(可重复读)
  • Serializable:可避免脏读、不可重复读、虚读情况的发生。(串行化)

查看事务隔离级别

mysql> select @@transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| REPEATABLE-READ         |
+-------------------------+

设置事务隔离级别

mysql> set [session/global] transaction isolation level [read uncommitted/read committed/repeatable read/serializable]

注:事务隔离级别越高,数据越安全,但是性能越低

session与global的区别

在MySQL中,SESSIONGLOBAL关键字用于设置系统变量的作用域。系统变量是用来配置MySQL服务器的。

  • SESSION关键字用于设置当前会话的系统变量值。这意味着这个变量的值只会影响到当前与MySQL服务器连接的客户端会话。当这个会话结束时,变量的值会被丢弃,并恢复为默认值或服务器启动时设置的值。在一个会话中设置的变量值不会影响到其他会话。

  • GLOBAL关键字用于设置服务器全局系统变量的值。这个变量的值会影响到所有新建立的会话。已经存在的会话不会受到影响,除非它们在GLOBAL变量改变之后被重新设置了SESSION变量的值。只有具有足够权限的用户才能设置GLOBAL变量,因为这会影响到服务器上所有用户的操作。

例如,如果你想要更改服务器的SQL模式只对当前会话有效,你可以这样做:

SET SESSION sql_mode = 'STRICT_TRANS_TABLES';

如果你想要更改服务器的SQL模式并让它对所有会话有效,你可以使用:

SET GLOBAL sql_mode = 'STRICT_TRANS_TABLES';

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实例:NX二次开发抽取平面以及标准柱面中心线

一、概述 最近体验许多外挂,包括胡波外挂、星空外挂及模圣等都有抽取面的中心线,由于刚刚学习,我尝试看看能不能做出来,本博客代码没有封装函数,代码有待改进,但基本可以实现相应的功能。 二、案例实现的功…

Sora 原理与技术实战笔记一

b 站视频合集 【AIX组队学习】Sora原理与技术实战:Sora技术路径详解 Sora 技术报告(OpenAI) huggingsd 文生图视频系列的一个开源项目 最强视频生成模型Sora相关技术解析 https://github.com/lichao-sun/SoraReview 惊艳效果: 长…

Ps:路径面板

Ps菜单:窗口/路径 Window/Paths “路径”面板 Paths Panel提供了一系列功能,使用户能够创建、编辑、保存和利用路径。 ◆ ◆ ◆ 路径分类 在“路径”面板上的路径可分为五大类。 常规路径 Saved Path 也称“已保存的路径”,指的是已经存储在…

Python进阶学习:Pandas--DataFrame--如何把几列数据合并成新的一列

Python进阶学习:Pandas–DataFrame–如何把几列数据合并成新的一列 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1…

SpringMVC的配置2种(本质上还是一样的,实现的接口不同)

第一种SpringInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer 看第一种配置 package com.xxx.config; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; public class SpringInitConfig ext…

减少页面加载时间:提升用户体验的关键

✨✨ 祝屏幕前的您天天开心,每天都有好运相伴。我们一起加油!✨✨ 🎈🎈作者主页: 喔的嘛呀🎈🎈 目录 引言 一、为什么页面加载时间重要? 二、如何减少页面加载时间? …

Google发布Genie硬杠Sora:通过大量无监督视频训练最终生成可交互虚拟世界

前言 Sora 问世才不到两个星期,谷歌的世界模型也来了,能力看似更强大(嗯,看似):它生成的虚拟世界自主可控 第一部分 首个基础世界模型Genie 1.1 Genie是什么 Genie是第一个以无监督方式从未标记的互联网视频中训练的生成式交互…

UDP数据报套接字编程入门

目录 1.TCP和UDP的特点及区别 1.1TCP的特点 1.2UDP的特点 1.3区别 2.UDP Socket的api的介绍 2.1DatagramSocket API 2.2DatagramPacket API 3.回显客户端与服务器 3.1回显服务器 3.1.1UdpEchoServer类的创建 3.1.2服务器的运行方法start() 3.1.3main部分 3.1.4.完整…

nginx反向代理之缓存 客户端IP透传 负载均衡

一 缓存功能 缓存功能可以加速访问,如果没有缓存关闭后端服务器后,图片将无法访问,缓存功能默认关闭,需要开启。 相关选项: ​ proxy_cache zone_name | off; 默认off #指明调用的缓存,或关闭缓存机制;C…

【C++初阶】第四站:类和对象(下)(理解+详解)

前言: 本篇知识点:初始化列表、explicit关键字、static成员、友元、内部类、匿名对象、编译器的优化 专栏:C初阶 目录 再谈构造函数 1️⃣构造函数体赋值 2️⃣初始化列表 explicit关键字 static成员 1.static概念 2.static特性 面试…

Docker技术概论(4):Docker CLI 基本用法解析

Docker技术概论(4) Docker CLI 基本用法解析 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:http…

NC65 零预算控制规则 数据库表关系

NC65 零预算控制规则 数据库表关系 SELECT t1.createdby, t1.objname, t2.ctrlname, t2.pk_parent, t3.billtype, t3.nameidx, t3.pk_obj FROM tb_rule_formula t1 left join tb_ctrlformula t2 on t1.pk_obj t2.pk_parent left join tb_ctrlscheme t3 on t3.pk_ctrlformula …

Mysql安装教程

一、下载 点开下面的链接:https://dev.mysql.com/downloads/mysql/ 点击Download 就可以下载对应的安装包了, 安装包如下: 二、解压 下载完成后我们得到的是一个压缩包,将其解压,我们就可以得到MySQL 8.0.31 的软件本体了(就是一个文件夹…

Tomcat布署及优化-----JDK和Tomcat

1.Tomcat简介 Tomcat 是 Java 语言开发的,Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,Tomcat 属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选。一般来说&…

Vivado Vitis 2023.2 环境配置 Git TCL工程管理 MicroBlaze和HLS点灯测试

文章目录 本篇概要Vivado Vitis 环境搭建Vivado 免费标准版 vs 企业版Vivado Windows 安装Vivado 安装更新 Vivado 工程操作GUI 创建工程打开已有工程从已有工程创建, 重命名工程GUI导出TCL, TCL复原工程TCL命令 Vivado 版本控制BlinkTcl脚本新建导出重建工程纯Verilog BlinkTc…

抖音视频批量下载软件说明|视频采集挖掘工具

操作步骤如下: 打开抖音批量下载工具,进入软件界面的第一个选项卡页面。在搜索框中输入需要搜索的视频关键词,例如"汽车配件",然后点击"开启抓取"按钮开始搜索。软件将开始搜索并显示与关键词相关的视频内容…

祖传代码:历史的宝藏与现代的挑战

程序员是如何看待“祖传代码”的? 程序员眼中的“祖传代码”,就像一本古老而神秘的魔法书,藏着无穷的智慧和技巧,有些代码像家传宝贝,有些像祖传秘方。快来分享一下你遇到的“祖传代码”吧~ 一、祖传代码的历史与文…

算法------(13)KMP

例题:(1)AcWing 831. KMP字符串 。。其实写完也不太理解。。随便写点吧 KMP就是求next数组和运用next的数组的过程。相比传统匹配模式一次更新一单位距离的慢速方法,next数组可以让下表字符串一次更新n - next【n】个距离&#x…

三天学会阿里分布式事务框架Seata-seata事务日志mysql持久化配置

锋哥原创的分布式事务框架Seata视频教程: 实战阿里分布式事务框架Seata视频教程(无废话,通俗易懂版)_哔哩哔哩_bilibili实战阿里分布式事务框架Seata视频教程(无废话,通俗易懂版)共计10条视频&…

虚拟机中Linux的安装与初始化配置(更新时间24/3/1)

先问三个问题 vm虚拟机安装了吗?点击此处跳转虚拟机安装教程Linux镜像下载了吗?点击此处跳转Linux镜像下载教程新建Linux虚拟机配置了吗?点击此处跳转新建虚拟机的配置教程 顺序是:下载虚拟机–>下载Linux镜像–>新建Linux配…
最新文章