【MySQL】事务 【上】{事务的版本支持 事务提交方式 实验结论 用户问题 如何理解隔离性 隔离级别 查看与设置隔离性 四种隔离级别的场景 }

news2024/12/23 18:27:14

文章目录

  • 1.引入事务
    • 事务的版本支持
    • 事务提交方式
    • 实验结论
    • 用户问题
  • 2.隔离性
    • 如何理解隔离性
    • 隔离级别
    • 查看与设置隔离性
  • 4.四种隔离级别的场景
    • 读未提交
    • 读已提交
    • 可重复读
    • 串行化

1.引入事务

在这里插入图片描述
当客户端A检查还有一张票时,将票卖掉,还没有执行更新数据库的时候,客户端B检查了票数,发现大于0,于是又买了一次票。然后客户端A将票数更新回数据库。于是就出现了同一张票被卖了两次的情况。

所以数据库的 CURD 应该满足什么属性能解决上面的问题?

买票的过程得是原子的吧
买票互相应该不能影响吧
买完票应该要永久有效吧
买前,和买后都要是确定的状态吧

什么是事务?

事务就是一组DML(Data Manipulation Language)语句组成,这些语句在逻辑上存在相关性,这一组DML语句要么全部成功,要么全部失败,是一个整体。MySQL提供一种机制,保证我们达到这样的效果。事务还规定不同的客户端看到的数据是不相同的。

事务就是要做的或所做的事情,主要用于处理操作量大,复杂度高的数据。假设一种场景:你毕业了,学校的教务系统后台MySQL 中,不在需要你的数据,要删除你的所有信息(一般不会:) ), 那么要删除你的基本信息(姓名,电话,籍贯等)的同时,也删除和你有关的其他信息,比如:你的各科成绩,你在校表现,甚至你在论坛发过的文章等。这样,就需要多条MySQL 语句构成,那么所有这些操作合起来,就构成了一个事务

正如我们上面所说,一个MySQL 数据库,可不止你一个事务在运行,同一时刻,甚至有大量的请求被包装成事务,在向MySQL 服务器发起事务处理请求。而每条事务至少一条SQL ,最多很多SQL ,这样如果大家都访问同样的表数据,在不加保护的情况,就绝对会出现问题。甚至,因为事务由多条SQL 构成,那么,也会存在执行到一半出错或者不想再执行的情况,那么已经执行的怎么办呢?

一个完整的事务,绝对不是简单的sql 集合,还需要满足如下四个属性:

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

上面四个属性,可以简称为ACID

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

为什么会出现事务

事务被MySQL 编写者设计出来,本质是为了当应用程序访问数据库的时候,事务能够简化我们的编程模型,不需要我们去考虑各种各样的潜在错误和并发问题.

可以想一下当我们使用事务时,要么提交,要么回滚,我们不会去考虑网络异常了,服务器宕机了,同时更改一个数据怎么办。

因此事务本质上是为了应用层服务的.而不是伴随着数据库系统天生就有的.

我们后面把MySQL 中的一行信息,称为一行记录

事务的版本支持

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

查看数据库引擎

mysql> show engines;           
mysql> show engines \G         
MyISAM 不支持。-- 表格显示-- 行显示
*************************** 1. row ***************************
 Engine: InnoDB    -- 引擎名称
Support: DEFAULT   -- 默认引擎
Comment: Supports transactions, row-level locking, and foreign keys -- 描述
Transactions: YES       -- 支持事务
XA: YES
 Savepoints: YES       -- 支持事务保存点
*************************** 2. row ***************************
 Engine: MRG_MYISAM
 Support: YES
 Comment: Collection of identical MyISAM tables
 Transactions: NO
 XA: NO
 Savepoints: NO
 *************************** 3. row ***************************
 Engine: MEMORY    --内存引擎
Support: YES
 Comment: Hash based, stored in memory, useful for temporary tables
 Transactions: NO
 XA: NO
 Savepoints: NO
  *************************** 4. row ***************************
 Engine: BLACKHOLE
 Support: YES
 Comment: /dev/null storage engine (anything you write to it disappears)
 Transactions: NO
 XA: NO
 Savepoints: NO
 *************************** 5. row ***************************
 Engine: MyISAM    
Support: YES
 Comment: MyISAM storage engine
 Transactions: NO           -- MyISAM不支持事务
XA: NO
 Savepoints: NO

事务提交方式

事务的提交方式常见的有两种:

自动提交
手动提交

查看事务提交方式

mysql> show variables like 'autocommit';
 +---------------+-------+
 | Variable_name | Value |
 +---------------+-------+
 | autocommit    | ON    |
 +---------------+-------+
 1 row in set (0.41 sec)

用 SET 来改变 MySQL的自动提交模式:

mysql> SET AUTOCOMMIT=0;            
Query OK, 0 rows affected (0.00 sec) #SET AUTOCOMMIT=0 禁止自动提交

mysql> show variables like 'autocommit';
 +---------------+-------+
 | Variable_name | Value |
 +---------------+-------+
 | autocommit    | OFF   |
 +---------------+-------+
 1 row in set (0.00 sec)

实验结论

  1. 只要输入begin或者start transaction,事务必须要通过commit提交才会持久化,与是否设置set autocommit无关。
  2. 事务可以手动回滚,同时,当操作异常,MySQL会自动回滚对于InnoDB 每一条SQL 语言都默认封装成事务,自动提交。(select有特殊情况,因为MySQL 有MVCC )
  3. 如果没有设置保存点,也可以回滚,只能回滚到事务的开始。直接使用 rollback(前提是事务还没有提交)
  4. 如果一个事务被提交了(commit),则不可以回退(rollback)。
  5. 可以选择回退到哪个保存点。
  6. InnoDB 支持事务,MyISAM 不支持事务。开始事务可以用start transaction 或者begin;
  7. mysql通过原子性,隔离性,持久性来达到一致性。

一个请求的完成通常需要多条有相关/逻辑的sql组成,这些sql集合我们称为事务。程序员/DBA角度看来,事务是一些sql语句,在上层用户/mysql的使用者看来,事务可以完成某种功能。由于服务器同一时间要处理多条事务/请求,且mysqld是多线程处理事务,故会涉及到安全问题,为了使得操作安全,人们设置了ACID四性。

MySQL同时需要处理多个事务,需要管理—先描述再组织—把多条sql打包成事务对象放到事务队列!

事务不是天然存在,而是在使用MySQL一段时间后,出现了各种问题,人们才意识到需要事务!事务出现之前,ACID需要程序员考虑,而事务出现之后,程序员只需要考虑sql的编写,其他由mysql完成!

mysql的服务尽量不要暴露在公网上,暴露了,允许访问,但不一定允许你登录! 为什么在Linux能登录,在windows不行:MySQL有自己的账号管理体系,并不是通过账号密码就能登陆上!还要有允许登录的权限!【MySQL用户登录表配置:用户管理那一篇讲到这个】windows登录:mysql -hIp -uroot -p -P3306

用户问题

多客户端访问:显示多客户端

在这里插入图片描述

证明事务的开始与回滚:回滚到指定保存点

在这里插入图片描述

回滚到最开始

在这里插入图片描述

证明未commit,客户端崩溃,MySQL自动会回滚(隔离级别当前为读未提交)。要么不操作 要么操作完 ctrl+\ 或者直接关闭会话 赵六都会消失【-ctrl+\异常终止MySQL】

在这里插入图片描述

证明commit了,客户端崩溃,MySQL数据不会在受影响,已经持久化

在这里插入图片描述
begin手动开启必须手动结束,与auto commit是否开启无关

autocommit只在当前客户端有效

在这里插入图片描述

现象出结论:autocommit影响的是非事务下的sql!准确的说,上面的begin下,如果没有手动提交(取决于手动commit与auto无关),而客户端崩溃,此时处于事务中,操作会回滚。而没有begin时,单sql也是一个事务,只不过单sql一单执行完毕,就会auto提交(取决于autocommit)。如果auto==off则客户端崩溃且在崩溃之前没有commit操作会回滚(如果手动commit不会,因为已经持久化了)。之前我们讲sql,auto默认是on的所以我们感知不到事务的概念!

在这里插入图片描述

在这里插入图片描述

2.隔离性

如何理解隔离性

MySQL服务可能会同时被多个客户端进程(线程)访问,访问的方式以事务方式进行。

一个事务可能由多条SQL构成,也就意味着,任何一个事务,都有执行前,执行中,执行后的阶段。而所谓的原子性,其实就是让用户层,要么看到执行前,要么看到执行后。

执行中出现问题,可以随时回滚。所以单个事务,对用户表现出来的特性,就是原子性。

但毕竟所有事务都要有个执行过程,那么在多个事务各自执行多个SQL的时候,就还是有可能会出现互相影响的情况。比如:多个事务同时访问同一张表,甚至同一行数据。

就如同你妈妈给你说:你要么别学,要学就学到最好。至于你怎么学,中间有什么困难,你妈妈不关心。那么你的学习,对你妈妈来讲,就是原子的。那么你学习过程中,很容易受别人干扰,此时,就需要将你的学习隔离开,保证你的学习环境是健康的。

数据库中,为了保证事务执行过程中尽量不受干扰,就有了一个重要特征:隔离性。数据库中,允许事务受不同程度的干扰,就有了一种重要特征:隔离级别。

隔离级别

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

隔离级别如何实现

隔离,基本都是通过锁实现的,不同的隔离级别,锁的使用是不同的。常见有,表锁,行锁,读锁,写锁,间隙锁(GAP),Next-Key锁(GAP+行锁)等。不过,我们目前现有这个认识就行,先关注上层使用。

A更新B查询是先更新还是先查询好?

有人说先更新,毕竟查询时都想要查询最新的数据,这种理解并不恰当,应该是:B事务到来时,看到他这个时间点应该看到的数据!隔离性的体现;谁先来谁先执行,要考虑,先执行不一定先结束,等上一个结束我在执行!

两个小孩在浑浊的水里游泳,A浮出水面后,B要想看到对方,自己必须浮出水面!

隔离级别谈论的都是读写并发

读读就不用说了,并发读随便读无安全问题。
写写必须加锁串行化执行。
读写,也是MySQL最常见的并发操作,针对读写设计隔离级别。在保证安全的前提下,尽可能的提高读写并发,这也是mysql的应用场景。

查看与设置隔离性

-- 查看
mysql> SELECT @@global.tx_isolation;   --查看全局隔级别
+-----------------------+
 | @@global.tx_isolation |
 +-----------------------+
 | REPEATABLE-READ       |
 +-----------------------+
 1 row in set, 1 warning (0.00 sec)
 
mysql> SELECT @@session.tx_isolation;   --查看会话(当前)全局隔级别
+------------------------+
 | @@session.tx_isolation |
 +------------------------+
 | REPEATABLE-READ        |
 +------------------------+
 1 row in set, 1 warning (0.00 sec)
 
mysql> SELECT @@tx_isolation;        --默认同上   
+-----------------+
 | @@tx_isolation  |
 +-----------------+
 | REPEATABLE-READ |
 +-----------------+
 1 row in set, 1 warning (0.00 sec)
 
 -- 设置当前会话 or 全局隔离级别语法
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ 
COMMITTED | REPEATABLE READ | SERIALIZABLE}
--设置当前会话隔离性,另起一个会话,只影响当前会话

mysql> set session transaction isolation level serializable; -- 串行化
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @@global.tx_isolation;     
+-----------------------+
 | @@global.tx_isolation |
 +-----------------------+
 | REPEATABLE-READ       |
 +-----------------------+
 1 row in set, 1 warning (0.00 sec)
 mysql> SELECT @@session.tx_isolation;    
+------------------------+
 | @@session.tx_isolation |
 +------------------------+
 | SERIALIZABLE           |
 +------------------------+
 1 row in set, 1 warning (0.00 sec)
 mysql> SELECT @@tx_isolation;          
+----------------+
 | @@tx_isolation |
 +----------------+
 | SERIALIZABLE   |
 +----------------+
 1 row in set, 1 warning (0.00 sec)
 
 --设置全局隔离性,另起一个会话,会被影响
mysql> set global transaction isolation level READ UNCOMMITTED;
 Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @@global.tx_isolation;
 +-----------------------+
 | @@global.tx_isolation |
 +-----------------------+
 | READ-UNCOMMITTED      |
 +-----------------------+
 1 row in set, 1 warning (0.00 sec)
 
 mysql> SELECT @@session.tx_isolation;
 +------------------------+
 | @@session.tx_isolation |
 +------------------------+
 | READ-UNCOMMITTED       |
 +------------------------+
 1 row in set, 1 warning (0.00 sec)
 
 mysql> SELECT @@tx_isolation;
 +------------------+
 | @@tx_isolation   |
 +------------------+
 | READ-UNCOMMITTED |
 +------------------+
 1 row in set, 1 warning (0.00 sec)-- 注意,如果没有现象,关闭mysql客户端,重新连接。

中途更改global,不会影响当前session,下次开启新的session会以新global为依据。

在这里插入图片描述

4.四种隔离级别的场景

读未提交

–几乎没有加锁,虽然效率高,但是问题太多,严重不建议采用。
–一个事务在执行中,读到另一个执行中事务的更新(或其他操作)但是未commit的数据,这种现象叫做脏读
(dirty read)
在这里插入图片描述

读已提交

在这里插入图片描述
在A提交前后,终端B在同一个事务内部看到了不同的数据。— 不可重复读

自己测试:只要A不提交,B提交与否都查不到最新信息,只有A提交B也提交才能查到最新信息。

在这里插入图片描述

不可重复读的问题

A提交了新数据 理应B在运行期间不应该看到新数据!而应该在之后的新事务应该看到。
在这里插入图片描述

可重复读

在终端B中,事务无论什么时候进行查找,看到的结果都是一致的,这叫做可重复读!在这里插入图片描述
B也提交才能看到!
在这里插入图片描述

上面的终端A中insert操作,会有什么问题?

–多次查看,发现终端A在对应事务中insert的数据,在终端B的事务周期中,也没有什么影响,也符合可重复的特点。但是,一般的数据库在可重复读情况的时候,无法屏蔽其他事务insert的数据。

(为什么?因为隔离性实现是对数据加锁完成的,而insert待插入的数据因为并不存在,那么一般加锁无法屏蔽这类问题),会造成虽然大部分内容是可重复读的,但是insert的数据在可重复读情况被读取出来,导致多次查找时,会多查找出来新的记录,就如同产生了幻觉。这种现象,叫做幻读(phantom read)。很明显,MySQL在RR级别的时候,是解决了幻读问题的(解决的方式是用Next-Key锁(GAP+行锁)解决的。这块比较难,有兴趣同学了解一下)。

串行化

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

终端A中有更新或者其他操作,会阻塞。直到终端B事务提交。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
其中隔离级别越严格,安全性越高,但数据库的并发性能也就越低,往往需要在两者之间找一个平衡点。
不可重复读的重点是修改和删除:同样的条件, 你读取过的数据,再次读取出来发现值不一样了
幻读的重点在于新增:同样的条件, 第1次和第2次读出来的记录数不一样

说明:

mysql 默认的隔离级别是可重复读,一般情况下不要修改
上面的例子可以看出,事务也有长短事务这样的概念。事务间互相影响,指的是事务在并行执行的时候,即都没有commit的时候,影响会比较大。

√:会发生该问题。只有串行化启用了共享锁加锁读。其他都有设置加锁读

在这里插入图片描述

顶级理解:

mysql只是工具 它提供了不同隔离级别的隔离策略 具体用哪一种取决于应用场景;aid保证c一致性,acid只是在数据库层面对用户的sql尽可能的提供了策略使得犯错的概率减少。但是一致性是由用户业务逻辑和aid共同支持的,因为数据库再好,用户给了业务逻辑很差的sql,mysql仍然会出错。

一致性(Consistency)

事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态。当数据库只包含事务成功提交的结果时,数据库处于一致性状态。如果系统运行发生中断,某个事务尚未完成而被迫中断,而未完成的事务对数据库所做的修改已被写入数据库,此时数据库就处于一种不正确(不一致)的状态。因此一致性是通过原子性来保证的。

其实一致性和用户的业务逻辑强相关,一般MySQL提供技术支持,但是一致性还是要用户业务逻辑做支撑,也就是,一致性,是由用户决定的。而技术上,通过AID保证C。

优秀文章

文章1
文章2
文章3

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

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

相关文章

CS61C | lecture6

Lecture 6 主流 ISA Register 汇编语言没有变量。它用寄存器来存储值。 寄存器是固定大小的小内存(32 位或者 64 位)。可以进行读取和写入,但是有数量限制,它们很快并且耗电少。 Registers vs. Memory What if more variables than registers? 如果…

Linux系统将Mint 便签源码打包成deb包并进行安装

网上有提供Ubuntu安装Mint便签的命令,此处不再赘述。而是通过Github Mint便签的说明书,对Mint便签的源码打包成deb包并进行安装。作为练习,方便以后对其他源码进行打包安装。 一、Mint Sticky的介绍 Sticky是一款适用于Linux桌面的笔记应用…

任何值得发表的学术论文,一定要具备一些基础的特性

1. 科学价值:论文的心脏 首先,你的论文需要有“心”——科学价值。这意味着你的研究要么发现了新大陆,要么采用了新方法,要么提供了新视角,或者至少突破了现有局限。记住,你的论文要给科学界带来新的血液&…

预览 txt,ppt,图片,word 等

1.引入查看的封装的组件 <template><div><div class"well" ref"output"></div></div> </template><script>import { getExtend, readBuffer, render } from ./util;/*** 支持嵌入式显示&#xff0c;基于postMes…

谢希仁计算机网络第八版期末复习简答(2)

网络层 路由转发分组&#xff08;简答&#xff09;※ 一个网络中的主机A向另一个网络中的主机B发送数据&#xff0c;首先A将数据包发送给自己的默认网关路由器。路由器收到数据包之后&#xff0c;查看数据包头部&#xff0c;解析目的IP地址依次查询路由表&#xff0c;根据最长…

基于Deap遗传算法在全量可转债上做因子挖掘(附python代码及全量因子数据)

原创文章第604篇&#xff0c;专注“AI量化投资、世界运行的规律、个人成长与财富自由"。 在4.x的时候&#xff0c;咱们分享过deap遗传算法挖掘因子的代码和数据&#xff0c;今天我们来升级到5.x中。 源码发布Quantlab4.2&#xff0c;Deap因子挖掘|gplearn做不到的咱们也…

AI为什么无法替代律师?

AI能否真正取代律师&#xff1f;一探究竟&#xff01; ©作者|LuMiQ 来源|神州问学 引言 数字化时代&#xff0c;AI技术正如催化剂般加速各行业的变革&#xff1a;在医疗界&#xff0c;它犹如医生的“第二双眼睛”&#xff0c;精准分析影像&#xff1b;制造业里&#xff…

【C语言】深入浅出:C语言链表的全面解析

目录 一、单链表1. 基本概念节点结构定义 2. 创建链表示例代码输出结果 3. 插入节点示例代码输出结果 4. 删除节点示例代码输出结果 二、双向链表1. 基本概念节点结构定义 2. 创建双向链表示例代码输出结果 3. 插入节点示例代码输出结果 4. 删除节点示例代码输出结果 三、循环链…

名师引路,育梦成光 | 云校名师张梁老师收到学员诚挚感谢信!

在这个蝉鸣悠长的夏日里&#xff0c;一封满载感恩之情的信笺&#xff0c;悄悄诉说着一段珍贵的师生情谊。近日&#xff0c;深圳云校又一届“HCIE精英班”圆满结课&#xff0c;临别之际&#xff0c;姜同学以笔为媒&#xff0c;向我们展示了一位不仅传授知识&#xff0c;更以人格…

在kdevelop中运行程序并调试

补充前序知识&#xff1a; 1.CMakeLists.txt文件中&#xff0c;如下图&#xff0c;第一行生成的是静态库文件&#xff08;我们前一讲所使用的&#xff09;&#xff0c;第二行是动态库文件。 静态库与动态库&#xff1a; 静态库&#xff08;Static Libraries&#xff09; 定义…

torch.minimum与torch.min()

目录 1. torch.minimum 2. torch.minimum可以进行一个数组与多维度的比较 3.torch.min() 4. torch.min()多维度比较 1. torch.minimum torch.minimum() 函数用于逐元素地比较两个张量&#xff0c;并返回一个新的张量&#xff0c;其中每个元素是两个输入张量对应元素中的最小…

pychar安装、pychon安装、pycharm超过试用期30激活

如果pycharm超过试用期&#xff0c;可以双击vbs脚本重新激活 百度网盘&#xff1a; 链接: https://pan.baidu.com/s/1B-XyLOy3wjVWbJwuvZOHOw?pwdmsb6 提取码: msb6

基于域名的虚拟主机、多虚拟主机的配置、基于ip的虚拟主机及上线静态的前端系统(商城系统)

Day 14 基于域名的虚拟主机 说明&#xff1a; 一个配置文件一般只有一个http模块&#xff1b; 一个http模块可以有多个server模块&#xff1b; 一个server模块就是一套web项目&#xff1b; 一个server模块中可以有多个location&#xff1b; location就是项目中的url路由…

判断元音还是辅音字母

1.// kiki开始学习英文字母&#xff0c;bobo老师告诉他&#xff0c;有五个字母A&#xff08;a&#xff09;,E(e),O(o),U(u),I(i)为元音&#xff0c;其他所有字母为辅音 //请帮他编写程序判断输入的字母是元音&#xff08;vowel&#xff09;还是辅音&#xff08;consonant&#…

使用这个Blender工具非破坏性地自动化切割面板线

"Panel Cutter"插件自动化了在Blender中沿选定边缘创建程序化面板线的过程&#xff0c;使其成为硬表面建模的必备工具。 这是一个设计用来非破坏性地自动化切割程序化面板线的小工具。这个工具对于硬表面模型&#xff0c;如汽车、船只和飞机来说&#xff0c;是救星。…

Linux用户-普通用户

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注我&#xff0c;我尽量把自己会的都分享给大家&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 Linux是一个多用户多任务操作系统,这意味着它可以同时支持多个用户登录并使用系统。…

Java:面向对象(static,代码块,构造方法私有化,内部类)

5&#xff0c;static关键字 static是一个特殊的关键字&#xff0c;static的作用是将实例成员变为类成员&#xff0c;只能修饰在类里定义的成员部分&#xff08;成员变量、方法、内部类&#xff08;枚举和接口&#xff09;、初始化块&#xff09;。static修饰的成员表明它属于这…

三,搭建环境:事务控制

三&#xff0c;搭建环境&#xff1a;事务控制 文章目录 三&#xff0c;搭建环境&#xff1a;事务控制声明式事务配置注解写法查询操作增删改操作 声明式事务配置 在 demo-module01-web 的模块下的&#xff0c;spring-persist.xml 配置文件中 开启基于注解的声明式事务支持 <…

专硕复试线298/295!哈尔滨理工大学计算机考研考情分析!

哈尔滨理工大学&#xff08;Harbin University of Science and Technology&#xff09;&#xff0c;位于哈尔滨市&#xff0c;是黑龙江省人民政府与国家国防科技工业局共建高校&#xff0c;入选“中西部基础能力建设工程”高校、国家“特色重点学科项目”建设高校、教育部“卓越…

论文速递 | Management Science 5月文章合集

编者按&#xff1a; 在本系列文章中&#xff0c;我们梳理了运筹学顶刊Management Science在2024年5月份发布有关OR/OM以及相关应用的9篇文章的基本信息&#xff0c;旨在帮助读者快速洞察领域新动态。 推荐文章1 题目&#xff1a;Sensitivity Analysis of the Cost Coefficie…