【MySQL系列】MySQL的事务管理的学习(一)_ 事务概念 | 事务操作方式 | 事务隔离级别

news2024/11/18 5:26:41

「前言」文章内容大致是MySQL事务管理。

「归属专栏」MySQL

「主页链接」个人主页

「笔者」枫叶先生(fy)

MySQL

目录

  • 一、事务概念
  • 二、事务的版本支持
  • 三、事务提交方式
  • 四、事务常见的操作方式
    • 4.1 事务正常操作
    • 4.2 事务异常验证
  • 五、事务隔离级别
    • 5.1 查看与设置隔离性
    • 5.2 读未提交(Read Uncommitted)
    • 5.3 读提交(Read Committed)
    • 5.4 可重复读(Repeatable Read)
    • 5.5 串行化(Serializable)
    • 5.6 隔离级别总结
  • 六、一致性

一、事务概念

事务的概念

  • MySQL事务是指一系列的数据库操作(一组DML语句),这些操作要么全部成功执行,要么全部失败回滚。事务的目的是确保数据库的一致性和完整性
  • 事务就是要做的或所做的事情,主要用于处理操作量大,复杂度高的数据。
  • 假设一个电商网站的订单支付场景。在这个场景中,订单支付涉及到多个步骤和多个数据表的操作,如订单表、库存表和支付记录表等。
  • 例如,当用户点击支付按钮时,开始一个事务,然后依次执行创建订单、扣减库存和创建支付记录的操作。如果其中任何一个操作失败,整个事务会被回滚,订单不会被创建,库存不会被扣减,支付记录也不会被创建。只有当所有操作都成功执行后,事务才会被提交,订单支付完成
  • 这样,需要多条MySQL语句构成,那么所有这些操作合起来,就构成了一个事务
  • 再次回忆DML:DML【data manipulation language】数据操纵语言,用来对数据进行操作代表指令: insert,delete、update。DML中又单独分了一个DQL,数据查询语言,代表指令:select

MySQL同一时刻可能存在大量事务,如果不对这些事务加以控制,在执行时就可能会出现问题。

每条事务至少一条SQL或者很多条的SQL,这样如果大家都访问同样的表数据,在不加保护的情况,就绝对会出现问题。甚至,因为事务由多条SQL构成,那么,也会存在执行到一半出错或者不想再执行的情况,那么已经执行的怎么办?

因此一个完整的事务并不是简单的SQL集合,事务还需要满足如下四个属性:

  • 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样
  • 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作
  • 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable
  • 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失

上面的四个属性简称ACID

  • 原子性(Atomicity,又称不可分割性)
  • 一致性(Consistency
  • 隔离性(Isolation,又称独立性)
  • 持久性(Durability

为什么会出现事务

  • 事务被MySQL编写者设计出来,本质是为了当应用程序访问数据库的时候,事务能够简化我们的编程模型,不需要用户自己去考虑各种各样的潜在错误和并发问题
  • 如果MySQL只是单纯的提供数据存储服务,那么用户在访问数据库时就需要自行考虑各种潜在问题,包括网络异常、服务器宕机等。
  • 因此事务本质是为了应用服务的,而不是伴随着数据库系统天生就有的,而是后面使用了数据库一段时间之后,发现是需要事务这个功能的,MySQL的编写者就对事务进行的封装和支持

二、事务的版本支持

在 MySQL 中只有使用了Innodb数据库引擎的数据库或表才支持事务, MyISAM不支持

通过以下命令查看MySQL的数据库引擎,查看哪些引擎支持事务

show engines;

在这里插入图片描述
说明:

  • Transactions:表示存储引擎是否支持事务,可以看到InnoDB存储引擎支持事务,而MyISAM存储引擎不支持事务

三、事务提交方式

事务常见的提交方式有两种,分别是自动提交和手动提交

查看事务的提交方式:

show variables like 'autocommit';

ON表示自动提交被打开,值为OFF表示自动提交被关闭,即事务的提交方式为手动提交
在这里插入图片描述
可以用SET来改变MySQL的自动提交模式

SET AUTOCOMMIT=0; --禁止自动提交
SET AUTOCOMMIT=1; --开启自动提交

注:设置为0表示关闭自动提交,相当于将事务提交方式设置为手动提交
在这里插入图片描述
在这里插入图片描述

四、事务常见的操作方式

为了便于演示,需要将MySQL的隔离级别设置成读未提交,也就是把隔离级别设置的比较低,方便看到实验现象

隔离级有:(隔离级别依次提高,读未提交隔离级别最低)

  1. 读未提交(Read uncommitted
  2. 读提交(read committed
  3. 可重复读(repeatable read
  4. 串行化(Serializable

设置最低的隔离级别:

set global transaction isolation level read uncommitted;

在这里插入图片描述
注意:设置全局隔离级别后当前会话的隔离级别不会改变,只会影响后续与MySQL新建立的连接,因此需要重启终端才能看到会话的隔离级别被成功设置

重启客户端之后,再进行登录,查看如下:
在这里插入图片描述

然后创建测试表

create table if not exists account(
id int primary key,
name varchar(50) not null default '',
blance decimal(10,2) not null default 0.0
)ENGINE=InnoDB DEFAULT CHARSET=UTF8;

在这里插入图片描述

4.1 事务正常操作

测试1

启动两个终端,两个终端都各启动一个事务(右边不启动事务也行),启动事务使用以下命令任意一个:

begin;
-- or
start transaction

启动事务之后,查询该表是没有数据的

:这里事务提交方式为自动提交
在这里插入图片描述
左终端中的事务使用savepoint命令创建一个保存点,该命令用于设置一个保存点

savepoint 保存点名字;

在这里插入图片描述
在左终端中插入一条数据,在右终端中就能查看到左终端的事务向表中插入的记录
在这里插入图片描述
左终端中的事务使用savepoint命令创建一个保存点,然后继续向表中插入一条记录,这时在右终端中也能看到新插入的这条记录(读未提交)
在这里插入图片描述
左终端中的事务使用rollback命令回滚到事务

rollback to 保存点; -- 事务回滚到该保存点
rollback;          -- 默认回滚到事务的最开始

事务回滚到保存点s2,这时右终端在查看表中数据时就看不到刚才插入的第二条记录了
在这里插入图片描述
左终端中的事务直接使用rollback命令回滚到事务最开始,右边的终端查询数据为空
在这里插入图片描述
使用commit命令,可以提交事务(代表一个事务结束),提交事务后就不能回滚了
在这里插入图片描述
注意:提交事务之后就不能回滚了,再次rollback也无法回滚

上面是事务操作的正常情况,而事务更多是为了应对非正常的情况,比如MySQL客户端突然崩溃,不小心关闭等等

4.2 事务异常验证

演示1(体现事务的原子性)

目的:证明事务未commit,客户端崩溃,MySQL自动会回滚(隔离级别设置为读未提交,事务提交方式为自动提交)

两个终端都各启动一个事务,表中事先有一条数据(右边不启动事务也行)
在这里插入图片描述
左终端中的事务向表中插入一条记录,由于隔离级别是读未提交,因此在右终端中能够查询到插入的这条记录
在这里插入图片描述
左边的客户端异常退出ctrl + \(没有提交事务)
在这里插入图片描述
结果是MySQL会自动让事务回滚到最开始,这时右终端中就看不到之前插入的记录了
在这里插入图片描述

演示2(体现事务的持久性)

目的:证明事务commit了,即使客户端崩溃,MySQL数据不会在受影响,数据已经持久化(已经保存到磁盘),(隔离级别依旧设置为读未提交,事务提交方式为自动提交)

两个终端都各启动一个事务(右边不启动事务也行)
在这里插入图片描述
左终端中的事务向表中插入一条记录,由于隔离级别是读未提交,因此在右终端中能够查询到插入的这条记录
在这里插入图片描述
左终端进行提交事务,然后再异常退出
在这里插入图片描述
右终端中仍然可以看到之前插入的记录,因为事务提交后数据就被持久化了
在这里插入图片描述
即使是事务自动提交关闭了,只要commit了,数据依旧就被持久化了,下面实验3进行验证

演示3(验证实验)

目的:证明begin操作会自动更改提交方式,不会受MySQL是否自动提交影响

关闭自动提交

set autocommit = 0;

在这里插入图片描述
左终端中启动一个事务并向表中新插入一条记录(右边也可以启动一个事务),由于隔离级别是读未提交,因此在右终端中能够查询到新插入的这条记录
在这里插入图片描述
左终端进行提交事务,然后再异常退出,右终端中仍然可以看到之前插入的记录,因为事务提交后数据就被持久化了
在这里插入图片描述

上述说明:使用beginstart transaction·命令启动的事务,都必须要使用commit命令手动提交,数据才会被持久化,与是否设置autocommit无关

演示4

目的:证明单条SQL与事务的关系

左右两边的终端都关闭自动提交,右边不关也行(右边不影响操作)

set autocommit = 0;

在这里插入图片描述
不启动事务,直接删除一条数据,由于隔离级别是读未提交,右边的终端也能看到结果
在这里插入图片描述
执行完单条SQL语句后,左边的客户端直接异常退出;而右边终端被删除的数据被回滚回来了
在这里插入图片描述
左边的终端打开自动提交,右边不影响操作

set autocommit = 1;

在这里插入图片描述
不启动事务,直接删除一条数据,由于隔离级别是读未提交,右边的终端也能看到结果
在这里插入图片描述
执行完单条SQL语句后,左边的客户端直接异常退出,右边的数据没有发生变化,即左边终端的操作没有被回滚
在这里插入图片描述
实验结果说明:实际我们之前一直都在使用单SQL事务,只不过autocommit默认是打开的,因此单SQL事务执行后自动就被提交了

  • 全局变量autocommit是否被设置影响的是单条SQL语句,InnoDB中的每一条SQL都会默认被封装成事务
  • 如果autocommitON,则单条SQL语句执行后会自动被提交,如果为OFF,则SQL语句执行后需要使用commit进行手动提交,如果不手动提交,执行的SQL会发生回滚

上述实验结论

  • 只要输入begin或者start transaction,事务便必须要通过commit提交,才会持久化,与是否设置set autocommit无关
  • 事务可以手动回滚,同时,当操作异常,MySQL会自动回滚
  • 对于InnoDB每一条 SQL 语言都默认封装成事务,自动提交(select有特殊情况,因为MySQL有 MVCC, 下面谈)
  • 上述实验体现了事务本身的原子性(rollback),持久性(commit)

事务操作注意事项

  • 如果没有设置保存点,也可以回滚,只能回滚到事务的开始。直接使用rollback(前提是事务还没有提交)
  • 如果一个事务被提交了(commit),则不可以回退(rollback
  • 事务可以选择回退到哪个保存点(前提是事务还没有提交)
  • InnoDB支持事务,MyISAM不支持事务

五、事务隔离级别

  • MySQL服务可能会同时被多个客户端进程(线程)访问,访问的方式以事务的方式进行
  • 一个事务可能由多条SQL语句构成,也就意味着任何一个事务,都有执行前、执行中和执行后三个阶段
  • 而所谓的原子性就是让用户层要么看到执行前,要么看到执行后,执行中如果出现问题,可以随时进行回滚,所以单个事务对用户表现出来的特性就是原子性
  • 但毕竟每个事务都有一个执行的过程,在多个事务各自执行自己的多条SQL时,仍然可能会出现互相影响的情况,比如多个事务同时访问同一张表,甚至是表中的同一条记录
  • 数据库为了保证事务执行过程中尽量不受干扰,于是出现了隔离性
  • 数据库为了允许事务在执行过程中受到不同程度的干扰,于是出现了隔离级别

隔离级别:(依次提高)

  1. 读未提交Read Uncommitted):在该隔离级别,所有的事务都可以看到其他事务没有提交的执行结果(实际生产中不可能使用这种隔离级别的),但是相当于没有任何隔离性,也会有很多并发问题,如脏读,幻读,不可重复读等,我们上面为了做实验方便,用的就是这个隔离性
  2. 读提交Read Committed):该隔离级别是大多数数据库的默认的隔离级别(不是 MySQL 默
    认的)。它满足了隔离的简单定义:一个事务只能看到其他的已经提交的事务所做的改变。这种隔离级别会引起不可重复读,即一个事务执行时,如果多次 select,可能得到不同的结果
  3. 可重复读Repeatable Read):这是MySQL默认的隔离级别,它确保同一个事务,在执行中,多次读取操作数据时,会看到同样的数据行,但是会有幻读问题
  4. 串行化Serializable):这是事务的最高隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决了幻读的问题。它在每个读的数据行上面加上共享锁,但是可能会导致超时和锁竞争(这种隔离级别太极端,实际生产基本不使用)

隔离级别基本都是通过锁实现的,不同的隔离级别,锁的使用是不同的。常见有,表锁,行锁,读锁,写锁,间隙锁(GAP),Next-Key锁(GAP+行锁)等

5.1 查看与设置隔离性

查看全局隔级别

select @@global.tx_isolation;

在这里插入图片描述

查看当前会话隔离级别

select @@session.tx_isolation;

在这里插入图片描述
还可以使用以下命令查看当前会话的隔离级别

select @@tx_isolation;

在这里插入图片描述

设置当前会话隔离级别

set session transaction isolation level 隔离级别;

例如,给当前会话设置串行化

set session transaction isolation level serializable;

在这里插入图片描述

:设置当前会话的隔离级别只会影响当前会话,新起的会话依旧采用全局的隔离级

设置全局隔离级别

set global transaction isolation level 隔离级别;

比如设置全局可重复读
在这里插入图片描述
注意:设置全局隔离级别会影响后续的新会话,但是不会影响当前会话,如果需要让全局隔离级别生效,需要重启该客户端
在这里插入图片描述
下面进行实验演示,演示四个隔离级别

5.2 读未提交(Read Uncommitted)

启动两个终端,将隔离级别都设置为读未提交,然后查看表中数据

set session transaction isolation level read uncommitted;

在这里插入图片描述
左右两个终端各启动一个事务,左边终端对表中数据进行修改,左边终端的事务没有提交右边终端的事务可以看到修改的数据
在这里插入图片描述

说明

  • 像这种,一个事务在执行中,读到另一个执行中事务的更新(或其他操作)但是未commit的数据,这种现象叫做脏读(dirty read)
  • 读未提交是事务的最低隔离级别,几乎没有加锁,虽然效率高,但是问题比较多,所以严重不建议使用

5.3 读提交(Read Committed)

启动两个终端,将隔离级别都设置为读提交,然后查看表中数据
在这里插入图片描述
两个终端各自启动一个事务,左终端进行对表中数据修改,在左终端事务未提交之前,右终端的事务看不到另一个事务的对数据的修改结果
在这里插入图片描述
只有当左终端中的事务提交后,右终端中的事务才能看到修改后的数据
在这里插入图片描述
说明

  • 像这种,当前事务并未commit和当前事务提交事务这两个时间段,另一个事务在这两个时间段读取到了不同的值,这种现象叫做不可重复读(non reapeatable read
  • 这种现象可能会导致数据的一致性问题,因为一个事务在不同的时间点读取到不同的数据值,可能会产生错误的计算结果或逻辑错误,不建议使用该隔离级别

5.4 可重复读(Repeatable Read)

启动两个终端,将隔离级别都设置为可重复读,然后查看表中数据
在这里插入图片描述
两个终端各自启动一个事务,左终端中的事务所作的修改在没有提交之前,右终端中的事务无法看到
在这里插入图片描述
并且当左终端中的事务提交后,右终端中的事务仍然看不到修改后的数据
在这里插入图片描述
只有当右终端中的事务提交事务之后,再查看表中数据,此时才能看到表中数据
在这里插入图片描述
说明

  • 向上面这样的,称之为可重复读
  • 但是,一般的数据库在可重复读情况的时候,update数据是满足可重复读的,但insert数据会存在幻读问题,因为隔离性是通过对数据加锁完成的,而新插入的数据原本是不存在的,因此一般的加锁无法屏蔽这类问题
  • 但是MySQL解决了可重复读隔离级别下的幻读问题(通过Next-Key锁(GAP+行锁)来解决幻读问题)
  • 幻读:一个事务在执行过程中,相同的select语句查询得到了不同的数据(出现新数据),如同出现了幻觉,这种现象叫做幻读

下面演示MySQL的可重复读是没有幻读问题

启动两个终端,将隔离级别都设置为可重复读,然后查看表中数据
在这里插入图片描述
然后两个终端各自启动一个事务,左终端向表中插入新数据并提交事务,右终端中的事务仍然看不到新插入的数据(证明没有幻读问题)
在这里插入图片描述

5.5 串行化(Serializable)

启动两个终端,将隔离级别都设置为串行化,然后查看表中数据
在这里插入图片描述
然后两个终端各自启动一个事务,如果这两个事务都对表进行的是读操作,那么这两个事务可以并发执行,不会被阻塞
在这里插入图片描述
果这两个事务中有一个事务要对表进行写操作,那么这个事务就会立即被阻塞
在这里插入图片描述
直到右边终端事务提交了之后,左终端的事务才能对表进行修改操作
在这里插入图片描述
说明

  • 对所有操作全部加锁,进行串行化,不会有问题,但是只要串行化,效率很低,几乎完全不会被采用

5.6 隔离级别总结

  • 其中隔离级别越严格,安全性越高,但数据库的并发性能也就越低,往往需要在两者之间找一个平 衡点
  • mysql 默认的隔离级别是可重复读,一般情况下不要修改

隔离级别总结如下:
在这里插入图片描述

六、一致性

事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态。当数据库只包含事务
成功提交的结果时,数据库处于一致性状态。

  • 事务在执行过程中如果发生错误,则需要自动回滚到事务最开始的状态,就像这个事务从来没有执行过一样,即一致性需要原子性来保证
  • 事务处理结束后,对数据的修改必须是永久的,即便系统故障也不能丢失,即一致性需要持久性来保证
  • 多个事务同时访问同一份数据时,必须保证这多个事务在并发执行时,不会因为由于交叉执行而导致数据的不一致,即一致性需要隔离性来保证
  • 其实一致性和用户的业务逻辑强相关,一般MySQL提供技术支持,但是一致性还是要用户业务逻辑做支撑,也就是说一致性,是由用户决定的
  • 在技术上,一致性需要原子性、持久性和隔离性来保证

--------------------- END ----------------------

「 作者 」 枫叶先生
「 更新 」 2023.9.7
「 声明 」 余之才疏学浅,故所撰文疏漏难免,
          或有谬误或不准确之处,敬请读者批评指正。

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

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

相关文章

flutter报错-cmdline-tools component is missing

安装完androidsdk和android studio后,打开控制台,出现错误 解决办法 找到自己安装android sdk的位置,然后安装上,并将下面的勾选上 再次运行 flutter doctor 不报错,出现以下画面 Doctor summary (to see all det…

视频融合平台EasyCVR综合管理平台加密机授权报错invalid character是什么原因

视频融合平台EasyCVR综合管理平台具备视频融合汇聚能力,作为安防视频监控综合管理平台,它支持多协议接入、多格式视频流分发,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包…

Java版 招投标系统简介 招投标系统源码 java招投标系统 招投标系统功能设计

项目说明 随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,以及…

【pytorch】数据加载dataset和dataloader的使用

1、dataset加载数据集 dataset_tranform torchvision.transforms.Compose([torchvision.transforms.ToTensor(),])train_set torchvision.datasets.CIFAR10(root"./train_dataset",trainTrue,transformdataset_tranform,downloadTrue) test_set torchvision.data…

高德地图,绘制矢量图形并获取经纬度

效果如图 我用的是AMapLoader这个地图插件,会省去很多配置的步骤,非常方便 首先下载插件,然后在局部引入 import AMapLoader from "amap/amap-jsapi-loader";然后在methods里面使用 // 打开地图弹窗mapShow() {this.innerVisible true;this.$nextTick(() > {…

祝贺!Databend Cloud 入驻 AWS 云市场

关于 Databend Cloud Databend Cloud 是基于开源云原生数仓项目 Databend 打造的一款易用、低成本、高性能的新一代大数据分析平台,提供一站式 SaaS 服务,免运维、开箱即用。 Databend Cloud 架构如下: 存储层完全面向对象存储而设计。 计算…

2023年海外推广怎么做?

答案是:2023海外推广可以选择谷歌SEO谷歌Ads双向运营。 理解当地文化 成功的海外推广首先是建立在对当地文化的深入了解和尊重的基础上。 本土化策略 为了更好地与当地用户互动,你的品牌、产品或服务需要与他们的文化和生活方式紧密相连。 例如&…

Linux/Windows中根据端口号关闭进程及关闭Java进程

目录 Linux 根据端口号关闭进程 关闭Java服务进程 Windows 根据端口号关闭进程 Linux 根据端口号关闭进程 第一步:根据端口号查询进程PID,可使用如下命令 netstat -anp | grep 8088(以8088端口号为例) 第二步:…

【大数据之Kafka】九、Kafka Broker之文件存储及高效读写数据

1 文件存储 1.1 文件存储机制 Topic是逻辑上的概念,而partition是物理上的概念,每个partition对应于一个log文件,该log文件中存储的是Producer生产的数据。 Producer生产的数据会被不断追加到该log文件末端,为防止log文件过大导致…

【网络编程】深入了解UDP协议:快速数据传输的利器

(꒪ꇴ꒪ ),Hello我是祐言QAQ我的博客主页:C/C语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍快上🚘,一起学习,让我们成为一个强大的攻城狮&#xff0…

MILP(混合整数线性规划)

线性规划定义 线性规划问题需要满足以下三个条件: 1.每一个问题用一组决策变量表示某一方案 2.约束条件可以用一组线性等式或者线性不等式来表示 3.目标函数为由决策变量及其有关的价值系数构成线性函数 ILP与MILP定义 整数线性规划中如果所有的变量被限制为&a…

闭包的详细认识与实例

参考https://www.bilibili.com/video/BV1sY4y1U7BT/?spm_id_from333.337.search-card.all.click&vd_source2a0404a7c8f40ef37a32eed32030aa18 一、什么叫闭包 1、问题引出: 不准用全局变量,也不准在调用代码块使用变量,实现计数…

以气象行业为例,浅谈在ToB/ToG行业中如何做好UI设计

商业气象公司是典型的TOB/TOG性质的公司,客户包括农业、能源、航空航天、交通运输、建筑工程等行业,它们需要准确的气象数据、预报和分析来支持业务决策和运营管理。商业气象公司通常会提供各种气象服务,如气象数据采集与分析、预报产品、风险…

软文推广效果怎么样?这篇揭晓答案

软文推广是一种常用的网络营销手段,它通过以文章形式发布关于产品、服务或品牌的信息,来引起受众的兴趣和关注。相较于直接宣传广告,软文推广更注重内容的质量和吸引力,能够更好地传递信息并提升用户转化率。本文伯乐网络传媒将探…

2023高教社杯全国大学生数学建模竞赛选题建议

如下为C君的2023高教社杯全国大学生数学建模竞赛&#xff08;国赛&#xff09;选题建议&#xff0c; 提示&#xff1a;DS C君认为的难度&#xff1a;C<B<A&#xff0c;开放度&#xff1a;B<A<C 。 D、E题推荐选E题&#xff0c;后续会直接更新E论文和思路&#xf…

财报解读:休闲零食全渠道时代来临,卫龙如何追寻长期价值?

2023上半年&#xff0c;休闲零食行业进入边际复苏周期&#xff0c;据Sandalwood电商监测数据&#xff0c;2023年5月和6月&#xff0c;休闲食品线上销售同比增速分别为11%和12%。这一态势下&#xff0c;辣味休闲食品行业的龙头企业卫龙也取得阶段性成果。 近日&#xff0c;卫龙…

python+django医院住院收费管理系统设计与实现vue

基于Python语言设计并实现了医院管理系统。该系统基于B/S即所谓浏览器/服务器模式&#xff0c;应用B/S框架&#xff0c;选择MySQL作为后台数据库。系统主要包括首页、个人中心、用户管理、医生管理、科室管理、挂号管理、接诊管理、诊断结果管理、开处方管理、药房管理、药品出…

浪潮服务器安装CentOS 7 教程,并解决一直卡在 dracut问题

准备工作 服务器装centOS7.9 1.下载正确的镜像。 2.使用软碟通或者refus刻U 盘启动盘。 3.服务器插入U盘&#xff0c;开机&#xff0c;在inspur浪潮logo界面按F11 进入启动菜单页面&#xff0c;选择U 盘启动。 4.开始安装centos系统。 注意&#xff1a;必须使用软碟通或者re…

《C++设计模式》——结构型

前言 结构模式可以让我们把很多小的东西通过结构模式组合起来成为一个打的结构&#xff0c;但是又不影响各自的独立性&#xff0c;尽可能减少各组件之间的耦合。 Adapter Class/Object(适配器&#xff09; Bridge(桥接&#xff09; Composite(组合) Decorator(装饰) 动态…

项目打包docker镜像 | 上传nexus | jenkins一键构建

文章目录 前言准备实操1、打开docker的远程访问2、编写dockerfile文件3、指定nexus环境4、配置jenkins5、使用jenkins构建 总结 前言 Docker部署项目是指使用Docker容器化技术将应用程序及其依赖项打包成一个独立的、可移植的运行环境&#xff0c;并在各种操作系统和平台上进行…