系列九、事务

news2024/12/23 22:24:44

一、事务

1.1、概述

        事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或者撤销操作请求,即:这些操作要么同时成功,要么同时失败。 例如: 张三给李四转账1000块钱,张三银行账户的钱减少1000,而李四银行账户的钱要增加 1000。 这一组操作就必须在一个事务的范围内,要么都成功,要么都失败。

1.2、为什么需要事务

转账(理想情况):

转账这个操作, 需要按照以下三个步骤来完成:

     (1)查询张三账户余额;

     (2) 张三减少 1000;

     (3) 李四 增加1000;

转账(异常情况):

        异常情况, 也是分为以下这么三步来完成 , 在执行第三步时报错了 , 这样就导致张三减少1000 块钱 , 而李四的金额没变 , 这样就造成了数据的不一致 , 就出现问题了,如下:

解决:

        为了解决上述的问题,就需要通过数据库的事务来完成,我们只需要在业务逻辑执行之前开启事务,执行完毕后提交事务。如果执行过程中报错,则回滚事务,把数据恢复到事务开始之前的状态,这样就保证了张三和李四账户的钱是正确的了,不会出现一个账户的钱减少了,而另外一个账户的钱却没有增加的情形。

注意事项:

        默认MySQL的事务是自动提交的,也就是说,当执行完一条 DML 语句时, MySQL 会立即隐式的提交事务。

1.3、四大特性

原子性( Atomicity ):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
一致性( Consistency ):事务完成时,必须使所有的数据都保持一致状态。
隔离性( Isolation ):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
持久性( Durability ):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
上述就是事务的四大特性,简称 ACID 。

1.4、案例演示

1.4.1、数据初始化

use vhr;

drop table if exists account; 
create table account(
    id int primary key AUTO_INCREMENT comment 'ID',
    name varchar(10) comment '姓名',
    money double(10,2) comment '余额'
) comment '账户表';
 
insert into account(name, money) VALUES ('张三',2000), ('李四',2000);

1.4.2、事务相关命令

(1)查看默认的事务提交方式(默认为1,表示自动提交)
select @@autocommit; 

(2)修改为手动提交
set @@autocommit = 0;

(3)开启事务

start transcation 或者 begin;

(4)提交事务

commit;

(5)回滚事务

rollback;

1.4.3、未控制事务案例

正常情况:

异常情况:

1.4.4、控制了事务案例

注意事项:先把张三、李四的账户金额恢复为2000元;

(1)正常执行,提交事务

(2)异常执行,回滚事务

1.5、事务并发

1.5.1、概述

        生产环境中的数据操作千变万化,尤其是对于双11、双12这种大型的,全名参与的场景,事务并发操作更是数不胜数!这就为事务的并发问题埋下了伏笔,总的来说,MySQL中的事务并发会产生3类问题,即:脏读、不可重复读、虚读(幻读)

1.5.2、脏读

        一个事务读到了另外一个事务还没有提交的数据。

1.5.2、不可重复读

        一个事务先后读取同一条记录,但两次读取数据的结果不同,称之为不可重复读。

 

1.5.3、虚读(幻读) 

        一个事务按照相同的条件查询数据,第一次查询时没有查询到,另一个事务执行完insert后,再次查询又查询到了,好像出现了幻影,称之为"虚读(幻读)"。

 

1.6、事务隔离级别

1.6.1、概述

        为了解决并发事务所引发的各种问题,在数据库中引入了事务隔离级别的功能,主要分为如下几种:

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

1.6.2、事务隔离级别相关指令

(1)查看MySQL默认的事务隔离级别

select @@transaction_isolation;

(2)设置事务的隔离级别

SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }

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

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

相关文章

UI自动化Selenium 测试报告BeautifulReport使用及修改

一、BeautifulReport安装 pip安装 pip install BeautifulReport Pycharm中安装 二、原生报告样式 原生报告,因为我使用ddtunittest数据驱动模式,所以Excel中所有参数都会被拼接出来,导致测试方法里面有太多不需要展示的内容; …

IDEA配置一个新项目

git clone xxxxx 下载项目主分支 git checkout xxx 切换到需要开发的分支上 配置maven仓库 在File下的Settings中设置maven仓库 配置maven仓库的文件夹 配置好maven后,项目中会出现一个红色的pom.xml文件,右击文件,点击…,pom…

【计算机组成与体系结构Ⅱ】多处理器部分讨论题目

多处理机课堂讨论 1.并行计算体系结构有哪些? SIMD、MIMD 2.多处理机的存储结构有哪些? 对称式共享存储器结构、分布式共享存储结构 3.什么是多处理机的一致性? 如果对某个数据项的任何读操作均可得到其最新写入的值,则认为这个存储系统是一致的。 4.监听协议的工…

Ubuntu 常用命令之 ln 命令用法介绍

ln命令在Ubuntu系统中用于创建硬链接或符号链接。硬链接是指向文件的物理地址,而符号链接(也称为软链接)是指向文件路径的引用。 命令格式:ln [选项]... [-T] 目标(源文件) 链接(目标文件&…

windows下使用logstash同步跨网络集群的数据

我们在开发环境过程中,可能会遇到这样的场景。我们可以通过VPN访问远端的机房。有可能还要跨机房访问。这篇文章演示使用logstash,在windows上,去同步跨网络环境的不同机房之间的数据。 此方式受网络限制。适合同步小规模数据。 下载logstash…

基于Java SSM框架实现图书店仓库进销存管理系统项目【项目源码+论文说明】

基于java的SSM框架实现图书店仓库进销存管理系统演示 摘要 仓库作为储存货物的核心功能之一,在整个仓储中具有非常重要的作用,是社会物质生产的必要条件。良好的仓库布局环境能够对货物进入下一个环节前的质量起保证作用,能够为货物进入市场…

AVL树-详细解析【数据结构】

AVL树是首个被发明的自平衡二叉查找树,在1962年由两位苏联科学家G.M. Adelson-Velsky和E.M. Landis提出。AVL树得名于发明者的首字母。在AVL树中,任何节点的两个子树的高度最大差别为一,确保了树的平衡度,使得查找操作相比于普通的…

JavaScript数组分组groupBy

JavaScript 最近发布了一个方法 Object.groupBy,可以对可迭代对象中的元素进行分组。 语法: Object.groupBy(items, callbackFn)items 被分组的可迭代对象,如 Array。 callbackFn 对可迭代对象中的每个元素执行的函数。 举个例子&#…

圣诞树绘制合集-python绘制

使用Python绘制迷人的圣诞树 引言 随着圣诞节的临近,我们都希望以各种方式庆祝这个欢乐的节日。作为一名编程爱好者,你有没有想过用Python来创造节日的气氛呢?在这篇文章中,我将向你展示如何用Python绘制几种不同风格的圣诞树&a…

Linux之进程(四)(进程地址空间)

目录 一、程序地址空间 二、进程地址空间 1、概念 2、写时拷贝 3、为什么要有进程地址空间 四、总结 一、程序地址空间 我们先来看看下面这张图。这张图是我们在学习语言时就见到过的内存区域划分图。 下面我们在Linux下看一看内存区域是不是也是这么划分的。 可见在Li…

浅谈MapReduce

MapReduce是一个抽象的分布式计算模型,主要对键值对进行运算处理。用户需要提供两个自定义函数: map:用于接受输入,并生成中间键值对。reduce:接受map输出的中间键值对集合,进行sorting后进行合并和数据规…

RabbitMq交换机详解

目录 1.交换机类型2.Fanout交换机2.1.声明队列和交换机2.2.消息发送2.3.消息接收2.4.总结 3.Direct交换机3.1.声明队列和交换机3.2.消息接收3.3.消息发送3.4.总结 4.Topic交换机4.1.说明4.2.消息发送4.3.消息接收4.4.总结 5.Headers交换机5.1.说明5.2.消息发送5.3.消息接收5.4.…

Linux(23):Linux 核心编译与管理

编译前的任务:认识核心与取得核心原始码 Linux 其实指的是核心。这个【核心(kernel)】是整个操作系统的最底层,他负责了整个硬件的驱动,以及提供各种系统所需的核心功能,包括防火墙机制、是否支持 LVM 或 Quota 等文件系统等等&a…

数据分析为何要学统计学(2)——如何估计总体概率分布

明确总体的概率分布类型及参数是进行数据分析的基础,这项工作称为分布推断与参数估计。在总体分布及其参数不明确的情况下,我们可以利用手头掌握的样本来完成这项工作。具体过程由以下步骤组成。 第一步,样本统计特性直观估计 我们采用Seab…

虚拟机VirtualBox和VMware安装Ubuntu16配置静态IP

计算机集群安装之前,准备先在虚拟机上尝试一下,网上多是采用VMware虚拟机和CentOS系统,个人则准备采用已经安装好的VirtualBox虚拟机和Ubuntu16,但遇到第一个问题即是配置静态IP,那么对于以上两种虚拟机静态IP配置的问…

(数据结构)单链表的查找和长度计算

代码实现 #include<stdio.h> #include<stdlib.h> typedef struct LNode {int data;struct LNode* next; }LNode,*LinkList; //创建头结点 LNode* InitList(LinkList L) {L (LNode*)malloc(sizeof(LNode));if (L NULL){return NULL;}L->data 0;L->next N…

掌握STL中stack和queue的用法(零基础/小白,全方面了解)

目录 1. stack的概念 2. stack的接口 2.1 构造函数&#xff08;初始化&#xff09; 2.2 赋值 2.3 存取操作 2.4 大小操作 3. queue的概念 4. queue的接口 4.1 构造函数 4.2 赋值操作 4.3 存取操作 4.4 大小操作 stack和queue接口函数很少&#xff0c;只要大家多敲一两…

设计模式(3)--对象结构(3)--组合

1. 意图 将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。 2. 三种角色 抽象组件(Component)、组合式节点(Composite)、叶节点(Leaf) 3. 优点 3.1 定义了包含基本对象和组合对象的类层次结构。 客户代码中&…

八大排序——快速排序(霍尔 | 挖空 | 前后指针 | 非递归)

我们今天来讲讲八大排序中的快速排序&#xff0c;快速排序最明显的特点就是排序快&#xff0c;时间复杂度是O&#xff08;N* logN&#xff09;&#xff0c;但是坏处就是如果排序的是一个逆序的数组的时候&#xff0c;时间复杂度是O&#xff08;N^2&#xff09;,还不用我们的插入…

【Hive_03】单行函数、聚合函数、窗口函数、自定义函数、炸裂函数

1、函数简介2、单行函数2.1 算术运算函数2.2 数值函数2.3 字符串函数&#xff08;1&#xff09;substring 截取字符串&#xff08;2&#xff09;replace 替换&#xff08;3&#xff09;regexp_replace 正则替换&#xff08;4&#xff09;regexp 正则匹配&#xff08;5&#xff…