深入解析MySQL中的事务(上)
MySQL事务管理
- 一、事务的基本概念
- 为什么需要事务?
- 1. 数据完整性
- 2. 并发控制
- 3. 错误恢复
- 4. 复杂业务逻辑的支持
- 5. 安全性
- 为什么会出现事务
- 查看引擎是否支持事务
- 事务提交方式
- 自动提交(Automatic Commit)
- 手动提交(Manual Commit)
- 如何查看和设置事务提交方式
- 小结
- 二、事务的操作
- 回滚与保存点演示
- begin会自动更改提交方式
- 单条SQL与事务关系
- 再谈autocommit
- 小结
- BEGIN 或 START TRANSACTION
- SAVEPOINT
- ROLLBACK TO
- ROLLBACK
- COMMIT
- 示例
- 三、事务的四大特性(ACID)
- 1. 原子性(Atomicity)
- 2. 持久性(Durability)
引言:
在数据库管理系统中,事务(Transaction)是一个非常重要的概念。它确保了一系列数据库操作的原子性、一致性、隔离性和持久性(通常简称为ACID属性)。MySQL作为广泛使用的关系型数据库管理系统,支持事务处理,这对于确保数据完整性和并发控制至关重要。接下来,我们将对MySQL中的事务及其四大特性进行深度剖析。
一、事务的基本概念
事务是一系列数据库操作的逻辑单元,这些操作要么全部执行,要么全部不执行,以保持数据库的完整性和一致性。
事务的边界由用户明确指定,通常是通过SQL语句的开始(如START TRANSACTION
)和提交(如COMMIT
)或回滚(如ROLLBACK
)来定义的。
为什么需要事务?
事务在数据库管理系统中起着至关重要的作用,它们的存在主要是为了解决在并发操作和数据更新过程中可能遇到的各种问题,从而确保数据的完整性和一致性。
以下是为什么需要事务的几个关键原因:
1. 数据完整性
事务确保了一系列数据库操作的原子性,即这些操作要么全部成功执行,要么全部不执行。
这是非常重要的,因为如果一个操作序列(例如转账操作)中的某个步骤失败,而其他步骤已经成功执行,那么数据就会处于不一致的状态。事务确保了在出现错误或异常情况时,数据库可以回滚到操作前的状态,从而保持数据的完整性。
2. 并发控制
在并发环境中,多个用户或应用程序可能同时尝试访问和修改相同的数据。如果没有适当的事务管理,这些并发操作可能会导致数据冲突和不一致。事务通过提供隔离性,确保了一个事务在修改数据时不会被其他事务干扰,从而避免了数据冲突和并发问题。
3. 错误恢复
在数据库操作中,可能会出现各种错误,如程序错误、网络故障或硬件故障等。如果没有事务,这些错误可能会导致数据库处于不一致的状态,并且可能需要手动修复或恢复。事务通过提供持久性和可恢复性,确保了在出现错误时,数据库可以恢复到一致的状态,并且可以通过日志记录来恢复丢失的数据。
4. 复杂业务逻辑的支持
许多业务逻辑操作需要跨越多个表或多个步骤,并且这些步骤必须作为一个整体来执行。
例如,一个在线购物系统可能需要在用户购买商品时更新库存、创建订单、发送通知等。这些操作必须作为一个事务来执行,以确保它们要么全部成功,要么全部失败。事务提供了这种能力,支持复杂的业务逻辑操作,并确保数据的完整性和一致性。
5. 安全性
事务还可以提供安全性保障。通过限制对数据的并发访问和确保数据在更新过程中的一致性,事务可以防止未经授权的访问和数据篡改。
这对于保护敏感数据和确保数据的安全性至关重要。
综上所述,事务在数据库管理系统中扮演着不可或缺的角色。它们通过确保数据的完整性、并发控制、错误恢复、支持复杂业务逻辑和提高安全性等方面,为数据库操作提供了强有力的保障。因此,在设计和开发数据库应用程序时,合理使用和管理事务是非常重要的。
为什么会出现事务
事务被 MySQL 编写者设计出来,本质是为了当应用程序访问数据库的时候,事务能够简化我们的编程模型,不需要我们去考虑各种各样的潜在错误和并发问题.可以想一下当我们使用事务时,要么提交,要么回滚,我们不会去考虑网络异常了,服务器宕机了,同时更改一个数据怎么办对吧?因此事务本质上是为了应用层服务的
.而不是伴随着数据库系统天生就有的.
备注:我们后面把 MySQL 中的一行信息,称为一行记录
查看引擎是否支持事务
在MySQL中,SHOW ENGINES
命令用于列出当前MySQL服务器支持的所有存储引擎及其相关信息。
这个命令的结果集包含几个字段,每个字段都提供了关于存储引擎的特定信息。
以下是SHOW ENGINES
结果集中常见字段的解析:
-
Engine:
- 描述:存储引擎的名称。
- 示例:InnoDB, MyISAM, MEMORY, CSV, BLACKHOLE, FEDERATED 等。
-
Support:
- 描述:表示MySQL服务器如何支持该存储引擎。
- 可能的值:
- DEFAULT:这是MySQL的默认存储引擎(除非在配置文件中指定了其他引擎)。
- YES:MySQL支持这个存储引擎,但它不是默认的。
- NO:MySQL不支持这个存储引擎。
- DISABLED:这个存储引擎在MySQL中被禁用了。
-
Comment:
- 描述:关于存储引擎的简短描述或注释。
- 示例:对于InnoDB,可能是 “Supports transactions, row-level locking, and foreign keys”。
-
Transactions:
- 描述:指示该存储引擎是否支持事务。
- 可能的值:YES 或 NO。
-
XA:
- 描述:指示该存储引擎是否支持分布式事务(即XA事务)。
- 可能的值:YES 或 NO。
-
Savepoints:
- 描述:指示该存储引擎是否支持保存点(savepoints)。保存点是事务中的一个点,允许你回滚到该点而不是整个事务的开始。
- 可能的值:YES 或 NO。
-
Data_links(在某些MySQL版本中可能不存在):
- 描述:与存储引擎如何处理数据链接(例如,MyISAM中的.MYI文件)相关的某种信息。但现代MySQL版本可能不再显示此字段。
- 可能的值:(取决于具体的存储引擎)
-
Auto_commit:
- 描述:指示存储引擎是否支持自动提交模式。在自动提交模式下,每次SQL语句执行后都会自动提交事务。
- 可能的值:YES 或 NO(但通常所有存储引擎都支持自动提交)。
-
Commit:
- 描述:与存储引擎如何处理事务提交相关的某种信息(但现代MySQL版本可能不再显示此字段)。
- 可能的值:(取决于具体的存储引擎)
-
Rollback:
- 描述:与存储引擎如何处理事务回滚相关的某种信息(但现代MySQL版本可能不再显示此字段)。
- 可能的值:(取决于具体的存储引擎)
事务提交方式
在MySQL中,事务提交方式主要有两种:自动提交(Automatic Commit)和手动提交(Manual Commit)
。这两种方式决定了事务边界以及何时将事务中的修改持久化到数据库中。
自动提交(Automatic Commit)
MySQL的事务默认是自动提交的。也就是说,当你执行一条DML(数据操纵语言,如INSERT、UPDATE、DELETE)语句时,MySQL会立即隐式地提交这个事务。这意味着每次单独的DML语句都被视为一个单独的事务,并且一旦执行成功,其修改就会立即生效。
手动提交(Manual Commit)
手动提交方式允许你控制事务的边界。你可以使用START TRANSACTION
(或BEGIN
)语句来明确一个事务的开始,然后执行一系列的DML语句。这些语句在事务中是作为一个整体来处理的,只有当你显式地调用COMMIT
语句时,事务中的修改才会被持久化到数据库中。如果在事务执行过程中出现了错误或者你需要撤销事务中的修改,你可以调用ROLLBACK
语句来撤销事务中的所有修改,使数据回到事务开始前的状态。
如何查看和设置事务提交方式
你可以通过以下SQL语句来查看当前的事务提交方式:
SELECT @@autocommit;
如果返回的结果是1,表示当前是自动提交模式;如果返回的结果是0,表示当前是手动提交模式。
你可以通过以下SQL语句来设置事务提交方式:
- 设置为自动提交模式:
SET @@autocommit = 1;
- 设置为手动提交模式:
SET @@autocommit = 0;
在设置为手动提交模式后,你需要显式地调用COMMIT
或ROLLBACK
语句来控制事务的提交或回滚。
小结
事务提交方式的选择取决于你的具体需求。如果你希望每次DML语句都立即生效,那么可以使用自动提交模式;如果你需要控制多个DML语句作为一个整体来执行,并且可以在必要时撤销这些修改,那么应该使用手动提交模式。
二、事务的操作
准备工作——设置
隔离级别
(后文会讲到)和建立测试表
为了更好地验证效果,我们将隔离级别
设置为较低的READ UNCOMMITTED(读取未提交)
但是这里有一个问题——为什么我设置了隔离级别为READ UNCOMMITTED(读取未提交)但是查询还会出现两种不同的结果?(下文我们解答)
此时我们需要退出mysql
客户端,重新登录才会生效
创建一个银行用户表
mysql> create table if not exists bank_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;
回滚与保存点演示
启动两个终端,左终端使用begin或start transaction命令启动一个事务,右终端查看银行用户表中的信息。如下:
tips:在MySQL中,
BEGIN
和START TRANSACTION
命令在功能上是等价的,它们都是用来开始一个新的事务。这两个命令在大多数数据库系统中都被广泛接受,并且在MySQL中,它们没有任何实质性的区别。
左终端中的事务使用savepoint命令创建一个保存点,然后继续向表中插入一条记录,这时在右终端中也能看到新插入的这条记录(由于我们将隔离级别设置成了读未提交,因此在左终端中的事务使用commit提交之前,在右终端中就能查看到事务向表中插入的记录。)。如下:
再次向左终端中的事务使用savepoint命令创建一个保存点,然后继续向表中插入一条记录,这时在右终端中也能看到新插入的这条记录。如下:
左终端中的事务使用rollback命令回滚到保存点,这时右终端在查看表中数据时就看不到刚才插入的第二条记录了。如下:
直接rollback则回到最初begin位置
begin会自动更改提交方式
在左终端中启动一个事务并向表中新插入一条记录,由于隔离级别是读未提交,因此在右终端中能够查询到新插入的这条记录。如下:
如果左终端中的事务在提交之前与MySQL断开连接,那么MySQL依旧会自动让事务回滚到最开始,这时右终端中就看不到之前新插入的记录了。如下:
单条SQL与事务关系
- 实际全局变量
autocommit
是否被设置影响的是单条SQL语句,InnoDB中的每一条SQL都会默认被封装成事务。 autocommit
为ON,则单条SQL语句执行后会自动被提交,如果为OFF,则SQL语句执行后需要使用commit进行手动提交。
通过上述示例我们不难看出,我们就算写一条简单的insert
语句需要通过begin -> insert -> commit
才能完成数据的持久保存,但是我们平时插入:
一条简单的insert
语句也能实现持久化——即证明InnoDB中的每一条SQL都会默认被封装成事务。
再谈autocommit
关闭autocommit自动提交,此时再向表中插入数据——右边依然可以查看到插入数据
但是我们意外退出(ctrl+\)或者正常退出(quit)都会发现,此时我们的insert语句好像并不像平时一样有持久的作用,这样更验证了上述的InnoDB中的每一条SQL都会默认被封装成事务。
小结
好的,以下是关于BEGIN
或START TRANSACTION
命令、SAVEPOINT
、ROLLBACK TO
、ROLLBACK
和COMMIT
在数据库事务处理中的小结:
BEGIN 或 START TRANSACTION
这两个命令用于启动一个新的事务。在事务开始之后,所有执行的SQL语句都将被视为一个逻辑单元,直到遇到COMMIT
或ROLLBACK
命令。如果所有语句都成功执行,则通过COMMIT
命令提交事务,使得所做的更改永久生效。如果在执行过程中遇到错误或需要撤销更改,则可以使用ROLLBACK
命令。
SAVEPOINT
SAVEPOINT
命令用于在事务中设置一个保存点。保存点是事务中的一个标记,它允许你在稍后的时间将事务回滚到该保存点的状态,而不是回滚到事务的开始。这对于在复杂事务中处理多个步骤时特别有用,因为你可以根据需要回滚到特定的步骤,而不是整个事务。
ROLLBACK TO
ROLLBACK TO
命令用于将事务回滚到指定的保存点。这意味着,从该保存点之后的所有更改都将被撤销,但保存点之前的更改仍然保留。这对于在事务的某个中间步骤遇到错误并希望撤销该步骤及之后的所有更改时特别有用。
ROLLBACK
ROLLBACK
命令用于撤销自事务开始以来的所有更改,并将数据库状态回滚到事务开始之前的状态。如果在事务中设置了保存点,并且没有使用ROLLBACK TO
指定保存点,则ROLLBACK
将回滚到事务的开始。
COMMIT
COMMIT
命令用于提交事务,使自事务开始以来的所有更改永久生效。一旦事务被提交,就不能再回滚这些更改(除非使用其他机制,如备份和恢复)。在提交事务之前,其他数据库用户或事务可能看不到你所做的更改(这取决于事务的隔离级别)。
示例
以下是一个简单的示例,演示了如何在事务中使用SAVEPOINT
、ROLLBACK TO
、ROLLBACK
和COMMIT
:
BEGIN;-- 初始状态
UPDATE your_table SET value = 100 WHERE id = 1;-- 设置一个保存点
SAVEPOINT my_savepoint;-- 进行一些更改
UPDATE your_table SET value = 200 WHERE id = 1;
UPDATE your_table SET value = 300 WHERE id = 2; -- 假设这行出现了错误-- 遇到错误,决定回滚到保存点
ROLLBACK TO my_savepoint;-- 再次确认状态
-- 此时id为1的记录的value应该为100,id为2的记录的value没有改变-- 继续事务并修复错误
UPDATE your_table SET value = 200 WHERE id = 2;-- 所有更改都正确,提交事务
COMMIT;
在这个示例中,我们首先在事务中设置了一个保存点,并在之后进行了一些更改。当遇到错误时,我们使用ROLLBACK TO
命令将事务回滚到保存点的状态。然后,我们修复了错误并继续事务,最后使用COMMIT
命令提交事务。
三、事务的四大特性(ACID)
1. 原子性(Atomicity)
原子性指的是事务作为一个整体来执行,包含在其中的对数据库的操作要么全部执行,要么全部不执行。事务的原子性是通过数据库的恢复机制来实现的,如果事务中的某个操作失败,那么系统有能力撤销事务中已经发生的所有操作,使数据库回到一个一致的状态。
示例:假设我们有一个银行账户转账操作,需要从账户A转账50元到账户B。这个操作包含两个步骤:从账户A减去50元,然后给账户B增加50元。如果这两个步骤不能作为一个整体来执行(即不具有原子性),那么可能会出现数据不一致的情况。例如,如果第一个步骤成功执行但第二个步骤失败,那么账户A的余额会错误地减少,而账户B的余额没有增加。为了避免这种情况,我们可以将这两个步骤放在一个事务中执行,确保它们要么都成功,要么都失败。
START TRANSACTION;
UPDATE bank_account SET blance = blance - 50 WHERE id = '1';
UPDATE bank_account SET blance = blance + 50 WHERE id = '2';
COMMIT;
如图,如果左边数据库突然断链接,那么右边则不会有数据(ctrl+z--挂起mysql
ctrl+\ 模拟中断mysql服务
)
这里看到,如果服务被突然中断,会回到begin之前的操作,体现了原子性(要么不做,要么做完)。
2. 持久性(Durability)
持久性指的是只要事务一旦提交,其所做的修改会永久地保存到数据库中,即使系统崩溃也不会丢失。这是通过数据库管理系统的日志和恢复机制来保证的。在MySQL中,当事务提交后,其更改会立即写入到磁盘上的数据文件中,并在后续的操作中持久化保存。
示例:一旦事务被提交,其对数据库中数据的更改就是永久性的,即使系统崩溃也不会丢失。为了演示这个特性,我们可以考虑一个银行账户转账操作的例子。假设我们已经成功地将50元从账户A转账到账户B,并且事务已经被提交。即使此时系统突然崩溃并重新启动,账户A的余额仍然会减少50元,而账户B的余额会增加50元。这是因为MySQL通过写日志和恢复机制来确保事务的持久性。
事务的隔离性和一致性请看下一篇章
相关文章:
深入解析MySQL中的事务(上)
MySQL事务管理 一、事务的基本概念为什么需要事务?1. 数据完整性2. 并发控制3. 错误恢复4. 复杂业务逻辑的支持5. 安全性 为什么会出现事务查看引擎是否支持事务事务提交方式自动提交(Automatic Commit)手动提交(Manual Commit&am…...
Springboot项目使用redis实现session共享
1.安装redis,并配置密码 这里就不针对于redis的安装约配置进行说明了,直接在项目中使用。 redis在windows环境下安装:Window下Redis的安装和部署详细图文教程(Redis的安装和可视化工具的使用)_redis安装-CSDN博客 2…...
【Linux】Centos7安装部署unimrcp,搭建MRCP服务器
yum install libtool yum install libtool-ltdl-devel yum install libsofia-sip-ua find / -name libsofia-sip-ua.so.0 2>/dev/null # 设置环境变量:如果库文件存在但不在默认搜索路径中,你可以通过设置 LD_LIBRARY_PATH 环境变量来告诉系统在哪…...
什么是Jetpack
Jetpack Jetpack 是一套组件库、工具,可帮助开发人员遵循最佳做法,减少样板代码并编写可在 Android 版本和设备上一致工作的代码,以便开发人员可以专注于他们关心的代码 组成 主要包含四部分:架构(Architecture&…...
macOS sonoma 14.4.1编译JDK 12
macOS sonoma 14.4.1编译JDK 12 环境参考文档开始简述问题心路历程着手解决最终解决(前面有点啰嗦了,可以直接看这里) 记录一次靠自己看代码解决问题的经历(总之就是非常开心)。 首先,先diss一下bing,我差一点就放弃了。 环境 macOS sonom…...
GPU通用计算介绍
谈到 GPU (Graphics Processing Unit,图形显示卡)大多数人想到的是游戏、图形渲染等这些词汇,图形处理确实是 GPU 的一大应用场景。然而人们也早已关注到它在通用计算上的巨大潜力,并提出了 GPGPU (General-purpose co…...
如果数据给的是树形 转好的树形结构并且是有两个二级children的话 该如何写?
第一我们要自己写一个children 并且张数据里面的所要渲染的二级进行赋值 赋给我们新建的children 以下是代码转树形赋值 organ().then(function (res) {console.log(res); // 成功回调// setLists(res.data.data)res.data.data res.data.data.map((obj) > ({...obj, // …...
C++ 函数重载
两个以上的函数,具有相同的函数名,但是形参的个数或者类型不同,编译器会根据实参的类型机个数的最佳来自动调用哪一个函数。 一 带默认形参值的函数 在定义函数时预先声明默认的形参值。调用时如果给出实参,则用实参初始化形…...
5. 分布式链路追踪TracingFilter改造增强设计
前言 在4. 分布式链路追踪客户端工具包Starter设计一文中,我们实现了基础的Starter包,里面提供了我们自己定义的Servlet过滤器和RestTemplate拦截器,其中Servlet过滤器叫做HoneyTracingFilter,仅提供了提取SpanContext࿰…...
C++数据类型与表达式
一 C中的数据类型 二 基本数据类型 三 类型转换 各种类型的高低顺序如下所述; 四 构造数据类型 类类型...
电脑ip地址设置成什么比较好
随着信息技术的快速发展,IP地址已成为电脑在网络世界中的“身份证”。它不仅是电脑在网络中进行通信的基础,也直接关系到网络连接的稳定性、安全性和效率。然而,面对众多IP地址设置选项,许多用户可能会感到困惑。那么,…...
vue-element-template优化升级dart-sass、pnpm
1、替换 node-sass 为 dart-sass - "node-sass": "^4.9.0","sass": "^1.75.0",替换css深度作用域写法 /deep/ >>># 替换为::v-deepVue:Node Sass VS. Dart Sass 2、替换npm为pnpm,需要补充一些依赖…...
Oracle拼接json字符串
在Oracle数据库中,并没有内建的JSON处理函数像其他现代数据库那样直接。但是,你可以使用字符串连接和格式化技巧来拼接JSON字符串。 以下是一个简单的例子,说明如何在Oracle中拼接一个JSON字符串: sql DECLARE v_json_string V…...
如何向Linux内核提交开源补丁?
2021年,我曾经在openEuler社区上看到一项改进Linux内核工具的需求,因此参与过Linux内核社区的开源贡献。贡献开源社区的流程都可以在内核社区文档中找到,但是,单独学习需要一个较长的过程,新手难以入门,因此…...
python数据分析——pandas DataFrame基础知识2
参考资料:活用pandas库 1、分组方式 我们可以把分组计算看作“分割-应用-组合”(split-apply-combine)的过程。首先把数据分割成若干部分,然后把选择的函数(或计算)应用于各部分,最后把所有独立…...
TODESK远程开机的原理
在现代计算机技术飞速发展的背景下,远程控制软件成为我们日常工作中不可或缺的工具。其中,ToDesk作为一款高效且易用的远程控制软件,备受用户青睐。那么,ToDesk远程开机的原理是什么呢?本文将为你揭晓这个秘密。 KKVie…...
【c1】数据类型,运算符/循环,数组/指针,结构体,main参数,static/extern,typedef
文章目录 1.数据类型:编译器(compiler)与解释器(interpreter),中文里的汉字和标点符号是两个字节,不能算一个字符(单引号)2.运算符/循环:sizeof/size_t3.数组…...
word图片水印
一、word中旧水印如何删除 打开word模板,想要删除旧水印,如下图所示操作,但是旧水印删除不掉。 以为上传新水印图片会替换掉旧水印,结果显示了2个水印,要怎么删除呢? 如下截图所示,双击打开页…...
kali安装及替换源
一、安装及简单配置 1.安装:地址就不贴了,自己打一下就好 2.虚拟机中打开kali 3.替换包源 (1)使用指令打开/etc/apt/sources.list mousepad /etc/apt/sources.list (2)将内容替换成阿里云源 deb http://mirrors.aliyun.com/kali kali-rolling main n…...
JSpdf,前端下载大量表格数据pdf文件,不创建dom
数据量太大使用dom》canvas》image》pdf.addimage方法弊端是canvas超出 浏览器承受像素会图片损害,只能将其切割转成小块的canvas,每一次调用html2canvas等待时间都很长累积时间更长,虽然最终可以做到抽取最小dom节点转canvas拼接数据,但是死…...
PHP关联数组[区别,组成,取值,遍历,函数]
关联数组 相较于数值数组,关联数组的索引可以为字符串和数字,关联数组元素也可称为键值对,索引为键,值为值。 源码 <?php echo "<hr>"; //水平线标签//关联数组$arr3 array(); //创建空的数组//关联数…...
JavaWeb--13Mybatis(2)
Mybatis(2) 1 Mybatis基础操作1.1 需求和准备工作1.2 删除员工日志输入参数占位符 1.3 新增员工1.4 修改员工信息1.5 查询员工1.5.1 根据ID查询数据封装 1.5.3 条件查询 2 XML配置文件规范3 MyBatis动态SQL3.1 什么是动态SQL3.2 动态SQL-if更新员工 3.3 …...
如何远程控制另一部手机:远程控制使用方法
在现今高科技的社会中,远程控制手机的需求在某些情境下变得越来越重要。不论是为了协助远在他乡的家人解决问题,还是为了确保孩子的在线安全,了解如何实现这一功能都是有益的。本文将为您简要介绍几种远程控制手机的方法及其使用要点。 KKVi…...
x64dbg中类似于*.exe+地址偏移
在CE和xdb中,形如*.exe数字偏移形式的地址被称为模块地址,CE附加到进程后点击查看内存,显示如下图 这种地址学名叫做模块地址,在x64dbg中显示如下图: CE中可以关闭,从而显示绝对的虚拟地址,如下…...
ICode国际青少年编程竞赛- Python-1级训练场-基础训练1
ICode国际青少年编程竞赛- Python-1级训练场-基础训练1 1、 Dev.step(4)2、 Dev.step(-4) Dev.step(8)3、 Dev.turnLeft() Dev.step(4)4、 Dev.step(3) Dev.turnLeft() Dev.step(-1) Dev.step(4)5、 Dev.step(-1) Dev.step(3) Dev.step(-2) Dev.turnLeft() Dev.step(…...
Baidu Comate智能编码助手
Baidu Comate智能编码助手 🎈1.Baidu Comate的简介🎈2.安装Baidu Comate🎈3.Baidu Comate实现功能🎈4.使用注释进行智能代码提示🎈5.结束语 🎈1.Baidu Comate的简介 根据官网的介绍,我们了解到B…...
nginx自动部署-跨操作系统
项目里面有一个需求,就是需要用让nginx进程提供给系统管理一个start,stop和getPid方法,这样系统管理可以自动拉起来nginx,达到自动部署的目的。离线部署同样适用 这样一来,我就需要提供windows版本linux不同版本的nginx源码包&am…...
组合模式(结构型)
目录 一、前言 二、透明组合模式 三、安全组合模式 四、总结 一、前言 组合模式(Composite Pattern)是一种结构型设计模式,将对象组合成树形结构以表示“部分-整体”得层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 组合模式由以下角色组成…...
Pspice for TI学习
Pspice for TI中PSpice Part Search空白解决方法 配置环境变量 Cad_PSpice_TI_Regr_Srvr https://software-dl.ti.com/pspice/S009 重新安装2023版的Pspice Pspice安装链接 打开新安装的软件即可发现PSpice Part Search可以正常使用了 VSIN各参赛的含义 VOFF直流偏置VAMPL…...
LoRA的原理简介
在文章开始前先澄清一个概念,需要区分形近的单词"LoRa"(long range),这是一项通信技术。熟悉物联网行业的朋友相对会比较熟悉LoRa这项技术,因为有些设备比如电梯的控制就使用了这个技术进行本地数据和命令的…...
wordpress 开发搜索框/结构优化是什么意思
这里的问题是,你的br元素之间唯一分离的是文本. CSS中的兄弟组合器忽略了元素之间的所有非元素节点,包括(但不限于)注释,文本和空格,因此就CSS而言,所有段落中都包含五个连续的br子元素:也就是说,每个段落中第一个之后的每个br都是br br(并且扩展为also a br ~ br).…...
陕西 做网站的公司/win7优化工具哪个好用
GDI绘图基础 编写图形程序时需要使用GDI(图形设备接口Graphics Device Interface),从程序设计的角度看,GDI包括两个部分:GDI对象和GDI函数。 GDI对象定义了GDI函数使用的工具和环境变量,GDI函数对象绘制各…...
旅游网站作用/百度网盘资源链接入口
AQS是JUC包中各种CAS同步器的基类,核心原理就是aqs维护了一个volatile的int类型的变量state,不同的同步器state代表的意义不同. 比如: CountDownLatch的实现中state变量指代的是一个计数. Semaphore的实现state代表的是一个令牌的数量. ReentrantLock的实现state代表的是冲入的…...
网站设计 上海/长沙网络推广网站制作
python的类方法和类的静态方法 (2010-03-11 21:27)分类: Pythonpython的类方法和类的静态方法,其实就是一个用classmethod和staticmethod修饰的类中的函数。其中类方法要在定义的时候指出在调用它时隐式赋给他的第一个参数,这个参数一般情况下…...
北京推广网站/广州市新闻发布
2019独角兽企业重金招聘Python工程师标准>>> 1.停止mysql服务 2.转至mysql安装目录的 bin 目录下 3.运行 mysqld --skip-grant-tables 4.新开cmd窗口,直接输入 mysql 然后不输入密码回车. 5.use mysql; 6.更新密码 update user set passwordpasswor…...