当前位置: 首页 > news >正文

深入解析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结果集中常见字段的解析:

  1. Engine

    • 描述:存储引擎的名称。
    • 示例:InnoDB, MyISAM, MEMORY, CSV, BLACKHOLE, FEDERATED 等。
  2. Support

    • 描述:表示MySQL服务器如何支持该存储引擎。
    • 可能的值:
      • DEFAULT:这是MySQL的默认存储引擎(除非在配置文件中指定了其他引擎)。
      • YES:MySQL支持这个存储引擎,但它不是默认的。
      • NO:MySQL不支持这个存储引擎。
      • DISABLED:这个存储引擎在MySQL中被禁用了。
  3. Comment

    • 描述:关于存储引擎的简短描述或注释。
    • 示例:对于InnoDB,可能是 “Supports transactions, row-level locking, and foreign keys”。
  4. Transactions

    • 描述:指示该存储引擎是否支持事务。
    • 可能的值:YES 或 NO。
  5. XA

    • 描述:指示该存储引擎是否支持分布式事务(即XA事务)。
    • 可能的值:YES 或 NO。
  6. Savepoints

    • 描述:指示该存储引擎是否支持保存点(savepoints)。保存点是事务中的一个点,允许你回滚到该点而不是整个事务的开始。
    • 可能的值:YES 或 NO。
  7. Data_links(在某些MySQL版本中可能不存在):

    • 描述:与存储引擎如何处理数据链接(例如,MyISAM中的.MYI文件)相关的某种信息。但现代MySQL版本可能不再显示此字段。
    • 可能的值:(取决于具体的存储引擎)
  8. Auto_commit

    • 描述:指示存储引擎是否支持自动提交模式。在自动提交模式下,每次SQL语句执行后都会自动提交事务。
    • 可能的值:YES 或 NO(但通常所有存储引擎都支持自动提交)。
  9. Commit

    • 描述:与存储引擎如何处理事务提交相关的某种信息(但现代MySQL版本可能不再显示此字段)。
    • 可能的值:(取决于具体的存储引擎)
  10. 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;

在设置为手动提交模式后,你需要显式地调用COMMITROLLBACK语句来控制事务的提交或回滚。

小结

事务提交方式的选择取决于你的具体需求。如果你希望每次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中,BEGINSTART 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都会默认被封装成事务。
在这里插入图片描述

小结

好的,以下是关于BEGINSTART TRANSACTION命令、SAVEPOINTROLLBACK TOROLLBACKCOMMIT在数据库事务处理中的小结:

BEGIN 或 START TRANSACTION

这两个命令用于启动一个新的事务。在事务开始之后,所有执行的SQL语句都将被视为一个逻辑单元,直到遇到COMMITROLLBACK命令。如果所有语句都成功执行,则通过COMMIT命令提交事务,使得所做的更改永久生效。如果在执行过程中遇到错误或需要撤销更改,则可以使用ROLLBACK命令。

SAVEPOINT

SAVEPOINT命令用于在事务中设置一个保存点。保存点是事务中的一个标记,它允许你在稍后的时间将事务回滚到该保存点的状态,而不是回滚到事务的开始。这对于在复杂事务中处理多个步骤时特别有用,因为你可以根据需要回滚到特定的步骤,而不是整个事务。

ROLLBACK TO

ROLLBACK TO命令用于将事务回滚到指定的保存点。这意味着,从该保存点之后的所有更改都将被撤销,但保存点之前的更改仍然保留。这对于在事务的某个中间步骤遇到错误并希望撤销该步骤及之后的所有更改时特别有用。

ROLLBACK

ROLLBACK命令用于撤销自事务开始以来的所有更改,并将数据库状态回滚到事务开始之前的状态。如果在事务中设置了保存点,并且没有使用ROLLBACK TO指定保存点,则ROLLBACK将回滚到事务的开始。

COMMIT

COMMIT命令用于提交事务,使自事务开始以来的所有更改永久生效。一旦事务被提交,就不能再回滚这些更改(除非使用其他机制,如备份和恢复)。在提交事务之前,其他数据库用户或事务可能看不到你所做的更改(这取决于事务的隔离级别)。

示例

以下是一个简单的示例,演示了如何在事务中使用SAVEPOINTROLLBACK TOROLLBACKCOMMIT

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&#xff0…...

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拼接数据,但是死…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​,覆盖应用全生命周期测试需求,主要提供五大核心能力: ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...