Spring 事务与 MySQL 事务:深度解析与实战指南

一、引言

在企业级应用开发中,事务处理是确保数据一致性和完整性的关键环节。Spring 框架作为广泛应用的 Java 开发框架,提供了强大的事务管理功能。而 MySQL 作为流行的关系型数据库,也具备完善的事务支持。本文将深入探讨 Spring 事务与 MySQL 事务的原理、特性、使用方法以及在实际项目中的应用,帮助开发者更好地理解和运用事务处理机制,确保应用的可靠性和数据的准确性。

二、事务的基本概念

(一)什么是事务

事务是一个逻辑工作单元,它包含了一组数据库操作,这些操作要么全部成功执行,要么全部回滚,以保证数据的一致性和完整性。例如,在银行转账系统中,从一个账户转出资金并转入另一个账户的操作就应该在一个事务中进行,以确保资金的正确转移,不会出现部分操作成功而部分操作失败的情况。

(二)事务的特性

  1. 原子性(Atomicity):事务中的所有操作要么全部成功执行,要么全部回滚,就像一个不可分割的原子。例如,在一个包含多个 SQL 语句的事务中,如果其中一个语句执行失败,整个事务将回滚到事务开始前的状态。
  2. 一致性(Consistency):事务执行前后,数据库必须保持一致的状态。例如,在一个银行转账事务中,转账前后两个账户的总金额应该保持不变。
  3. 隔离性(Isolation):多个事务并发执行时,它们之间应该相互隔离,互不干扰。每个事务都应该感觉不到其他事务的存在,就像在独立的环境中执行一样。
  4. 持久性(Durability):一旦事务成功提交,它对数据库的修改就应该永久保存下来,即使系统发生故障也不会丢失。

三、MySQL 事务

(一)MySQL 事务的实现

MySQL 通过 InnoDB 存储引擎实现事务。InnoDB 采用了多版本并发控制(MVCC)和锁机制来保证事务的隔离性和一致性。

  1. MVCC:InnoDB 为每一行数据维护多个版本,每个事务在执行过程中看到的数据版本是基于其开始时间确定的。这样可以实现非阻塞的读操作,提高并发性能。
  2. 锁机制:InnoDB 使用行级锁和表级锁来控制并发事务对数据的访问。行级锁可以提高并发度,但开销较大;表级锁开销较小,但并发度较低。InnoDB 会根据具体情况自动选择合适的锁类型。

(二)MySQL 事务的隔离级别

MySQL 支持四种事务隔离级别:

  1. READ UNCOMMITTED(读未提交):在这个隔离级别下,事务可以看到其他事务未提交的修改,这可能会导致脏读问题。
  2. READ COMMITTED(读已提交):事务只能看到其他事务已经提交的修改,避免了脏读问题,但可能会出现不可重复读和幻读问题。
  3. REPEATABLE READ(可重复读):在这个隔离级别下,事务在执行过程中始终看到的是同一个版本的数据,避免了不可重复读问题,但可能会出现幻读问题。这是 MySQL 的默认隔离级别。
  4. SERIALIZABLE(串行化):事务之间完全隔离,通过加锁的方式来保证事务的串行执行,避免了所有的并发问题,但会严重影响数据库的性能。

(三)MySQL 事务的使用方法

  1. 开启事务
    在 MySQL 中,可以使用 START TRANSACTION 语句来开启一个事务。例如:

START TRANSACTION;

  1. 执行事务中的操作
    在开启事务后,可以执行一系列的 SQL 语句,这些语句将作为一个事务的一部分。例如:

UPDATE table_name SET column1 = value1 WHERE condition;
INSERT INTO table_name (column1, column2) VALUES (value1, value2);
DELETE FROM table_name WHERE condition;

  1. 提交事务
    如果事务中的所有操作都成功执行,可以使用 COMMIT 语句来提交事务,使对数据库的修改永久生效。例如:
COMMIT;

  1. 回滚事务
    如果事务中的某个操作失败,可以使用 ROLLBACK 语句来回滚事务,撤销对数据库的修改。例如:
ROLLBACK;

(四)MySQL 事务的示例

以下是一个使用 MySQL 事务的示例:

-- 创建测试表
CREATE TABLE account (id INT PRIMARY KEY AUTO_INCREMENT,balance DECIMAL(10, 2)
);-- 插入初始数据
INSERT INTO account (balance) VALUES (1000.00);
INSERT INTO account (balance) VALUES (500.00);-- 开启事务
START TRANSACTION;-- 从账户 1 转出 200 元
UPDATE account SET balance = balance - 200.00 WHERE id = 1;-- 向账户 2 转入 200 元
UPDATE account SET balance = balance + 200.00 WHERE id = 2;-- 提交事务
COMMIT;-- 查询账户余额
SELECT * FROM account;

在上述示例中,首先创建了一个名为 account 的表,用于存储账户余额信息。然后插入了两个账户的初始余额。接着开启了一个事务,在事务中从账户 1 转出 200 元,并向账户 2 转入 200 元。最后提交事务,使对数据库的修改永久生效。如果在执行事务的过程中出现错误,可以使用 ROLLBACK 语句来回滚事务,撤销对数据库的修改。

四、Spring 事务

(一)Spring 事务的实现原理

Spring 事务管理是基于 AOP(面向切面编程)实现的。Spring 通过在目标方法执行前后插入事务处理的代码,实现了对事务的自动管理。

Spring 事务管理主要涉及以下几个核心接口和类:

  1. PlatformTransactionManager:这是 Spring 事务管理的核心接口,它定义了获取事务、提交事务和回滚事务的方法。不同的数据库实现需要提供相应的 PlatformTransactionManager 实现类。
  2. TransactionDefinition:这个接口定义了事务的属性,如隔离级别、传播行为、超时时间等。
  3. TransactionStatus:这个接口表示事务的状态,它提供了获取事务是否已完成、是否有保存点等方法。

Spring 在运行时会根据配置的事务属性,创建相应的 TransactionDefinition 和 PlatformTransactionManager 对象,并在目标方法执行前后调用 PlatformTransactionManager 的方法来管理事务。

(二)Spring 事务的传播行为

Spring 事务的传播行为定义了在多个事务方法相互调用时,事务如何传播。Spring 支持七种传播行为:

  1. REQUIRED(默认值):如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新事务。
  2. SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。
  3. MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
  4. REQUIRES_NEW:创建一个新事务,并暂停当前事务(如果存在)。
  5. NOT_SUPPORTED:以非事务方式执行,如果当前存在事务,则暂停当前事务。
  6. NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
  7. NESTED:如果当前存在事务,则在嵌套事务中执行;如果当前没有事务,则创建一个新事务。

(三)Spring 事务的隔离级别

Spring 事务的隔离级别与 MySQL 事务的隔离级别相对应,包括:

  1. ISOLATION_DEFAULT(默认值):使用底层数据库的默认隔离级别。
  2. ISOLATION_READ_UNCOMMITTED:读未提交。
  3. ISOLATION_READ_COMMITTED:读已提交。
  4. ISOLATION_REPEATABLE_READ:可重复读。
  5. ISOLATION_SERIALIZABLE:串行化。

(四)Spring 事务的使用方法

  1. 配置事务管理器
    在 Spring 配置文件中,需要配置一个 PlatformTransactionManager 实现类,用于管理事务。例如,对于 MySQL 数据库,可以使用 DataSourceTransactionManager
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/>
</bean>

其中,dataSource 是数据源的 bean 引用。

  1. 开启事务注解
    在需要进行事务管理的方法上,可以使用 @Transactional 注解来开启事务。例如:
@Service
public class AccountService {@Autowiredprivate JdbcTemplate jdbcTemplate;@Transactionalpublic void transferMoney(int fromAccountId, int toAccountId, double amount) {// 从账户转出资金jdbcTemplate.update("UPDATE account SET balance = balance -? WHERE id =?", amount, fromAccountId);// 模拟错误if (true) {throw new RuntimeException("转账失败");}// 向账户转入资金jdbcTemplate.update("UPDATE account SET balance = balance +? WHERE id =?", amount, toAccountId);}
}

在上述示例中,transferMoney 方法上使用了 @Transactional 注解,当方法执行时,Spring 会自动开启一个事务。如果方法执行过程中出现异常,Spring 会自动回滚事务。

  1. 配置事务属性
    可以通过 @Transactional 注解的属性来配置事务的属性,如隔离级别、传播行为、超时时间等。例如:

@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED, timeout = 30)
public void transferMoney(int fromAccountId, int toAccountId, double amount) {//...
}

在上述示例中,配置了事务的隔离级别为 READ_COMMITTED,传播行为为 REQUIRED,超时时间为 30 秒。

(五)Spring 事务的示例

以下是一个完整的 Spring 事务示例:

  1. 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd"><!-- 配置数据源 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="com.mysql.jdbc.Driver"/><property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test_db"/><property name="user" value="root"/><property name="password" value="password"/></bean><!-- 配置事务管理器 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!-- 开启事务注解支持 --><tx:annotation-driven transaction-manager="transactionManager"/><!-- 扫描服务类 --><context:component-scan base-package="com.example.service"/></beans>

  1. 服务类
package com.example.service;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;@Service
public class AccountService {@Autowiredprivate JdbcTemplate jdbcTemplate;@Transactionalpublic void transferMoney(int fromAccountId, int toAccountId, double amount) {// 从账户转出资金jdbcTemplate.update("UPDATE account SET balance = balance -? WHERE id =?", amount, fromAccountId);// 模拟错误if (true) {throw new RuntimeException("转账失败");}// 向账户转入资金jdbcTemplate.update("UPDATE account SET balance = balance +? WHERE id =?", amount, toAccountId);}
}

  1. 测试类
package com.example;import com.example.service.AccountService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");AccountService accountService = context.getBean(AccountService.class);try {accountService.transferMoney(1, 2, 200.00);System.out.println("转账成功");} catch (Exception e) {System.out.println("转账失败:" + e.getMessage());}}
}

在上述示例中,首先配置了数据源和事务管理器,并开启了事务注解支持。然后在 AccountService 类中定义了一个 transferMoney 方法,该方法上使用了 @Transactional 注解,用于开启事务。在方法中,首先从一个账户转出资金,然后模拟错误抛出异常,最后向另一个账户转入资金。由于方法上开启了事务,当抛出异常时,Spring 会自动回滚事务,确保数据的一致性。

五、Spring 事务与 MySQL 事务的结合

(一)Spring 如何与 MySQL 事务协同工作

Spring 事务管理通过与底层数据库的事务机制进行交互,实现了对事务的统一管理。在与 MySQL 数据库结合使用时,Spring 会根据配置的事务属性,调用 MySQL 的事务接口来开启、提交和回滚事务。

例如,当一个方法上使用了 @Transactional 注解时,Spring 会在方法执行前调用 PlatformTransactionManager 的 getTransaction 方法来获取一个事务对象。然后,在方法执行过程中,如果出现异常,Spring 会调用 PlatformTransactionManager 的 rollback 方法来回滚事务;如果方法正常执行完毕,Spring 会调用 PlatformTransactionManager 的 commit 方法来提交事务。

(二)事务传播行为在实际项目中的应用

在实际项目中,事务传播行为的选择取决于业务需求和方法之间的调用关系。以下是一些常见的应用场景:

  1. REQUIRED:这是最常用的传播行为,适用于大多数业务场景。如果一个方法需要在事务中执行,并且调用它的方法也在事务中,那么这个方法会加入到调用者的事务中;如果调用者没有事务,那么这个方法会创建一个新事务。
  2. REQUIRES_NEW:当一个方法需要在独立的事务中执行时,可以使用这个传播行为。无论调用者是否有事务,这个方法都会创建一个新的事务,并暂停调用者的事务(如果存在)。
  3. NESTED:当一个方法需要在嵌套事务中执行时,可以使用这个传播行为。如果调用者有事务,这个方法会在嵌套事务中执行;如果调用者没有事务,这个方法会创建一个新事务。

例如,在一个订单处理系统中,当创建订单时,需要调用多个服务来完成订单的创建、库存的扣减、支付的处理等操作。这些操作都需要在事务中执行,以确保数据的一致性。如果其中一个服务出现异常,整个订单的创建过程应该回滚。在这种情况下,可以使用 REQUIRED 传播行为来确保所有的服务都在同一个事务中执行。

(三)隔离级别在实际项目中的选择

在实际项目中,隔离级别的选择需要考虑业务需求和性能要求。以下是一些常见的选择原则:

  1. 如果业务对数据的一致性要求非常高,并且可以接受较低的并发性能,可以选择 SERIALIZABLE 隔离级别。但是,这个隔离级别会严重影响数据库的性能,一般只在特殊情况下使用。
  2. 如果业务对数据的一致性要求较高,并且需要一定的并发性能,可以选择 REPEATABLE READ 隔离级别。这是 MySQL 的默认隔离级别,能够避免不可重复读和幻读问题。
  3. 如果业务对数据的一致性要求不是很高,并且需要较高的并发性能,可以选择 READ COMMITTED 隔离级别。这个隔离级别能够避免脏读问题,但可能会出现不可重复读和幻读问题。
  4. 如果业务对数据的一致性要求非常低,并且需要非常高的并发性能,可以选择 READ UNCOMMITTED 隔离级别。但是,这个隔离级别可能会导致脏读问题,一般不建议在生产环境中使用。

例如,在一个在线购物系统中,商品的库存信息可能会被多个用户同时查询和修改。如果选择 SERIALIZABLE 隔离级别,会导致数据库的性能非常低,因为每个事务都需要等待其他事务完成才能执行。在这种情况下,可以选择 READ COMMITTED 隔离级别,以提高数据库的并发性能。同时,可以通过其他方式来保证数据的一致性,如使用乐观锁或悲观锁。

六、Spring 事务与 MySQL 事务的常见问题及解决方案

(一)事务不生效的问题

在使用 Spring 事务和 MySQL 事务时,有时会出现事务不生效的问题。以下是一些可能的原因和解决方案:

  1. 没有正确配置事务管理器:确保在 Spring 配置文件中正确配置了事务管理器,并且事务管理器与数据源正确关联。例如,对于 MySQL 数据库,通常使用 DataSourceTransactionManager。检查配置文件中的 bean 定义是否正确,以及数据源的引用是否正确。
  2. 方法没有被 Spring 管理:如果事务方法没有被 Spring 容器管理,事务注解将不会生效。确保事务方法所在的类被 Spring 扫描并创建为 bean。可以使用 @Component 或其他 Spring 注解来标记类,或者在配置文件中显式地配置 bean。
  3. 事务传播行为设置不当:如果事务方法的调用链中事务传播行为设置不当,可能会导致事务不生效。例如,如果一个事务方法调用了另一个没有事务的方法,并且事务传播行为设置为 SUPPORTS,那么外层事务可能不会生效。检查事务方法的调用链,确保事务传播行为符合预期。
  4. 数据库驱动不支持事务:某些数据库驱动可能不支持事务,或者需要特定的配置才能支持事务。检查数据库驱动的文档,确保驱动支持事务,并正确配置了连接参数。
  5. 异常被捕获而没有重新抛出:如果事务方法中捕获了异常,但没有重新抛出,Spring 将无法检测到异常并回滚事务。确保在事务方法中,如果出现异常,要么不捕获异常让它向上抛出,要么在捕获异常后重新抛出,以便 Spring 能够回滚事务。

(二)事务超时问题

在某些情况下,事务可能会执行很长时间,导致事务超时。以下是一些可能的原因和解决方案:

  1. 事务方法执行时间过长:如果事务方法中的业务逻辑执行时间过长,可能会超过事务的超时时间。检查事务方法中的代码,优化业务逻辑,减少执行时间。可以考虑使用异步处理、缓存等技术来提高性能。
  2. 事务超时时间设置不当:如果事务超时时间设置得太短,可能会导致事务在正常执行过程中超时。检查 Spring 配置文件中的事务超时时间设置,根据实际情况调整超时时间。可以根据业务需求和数据库性能来确定合适的超时时间。
  3. 数据库性能问题:如果数据库性能低下,事务执行时间可能会延长,导致事务超时。检查数据库的性能,优化 SQL 查询、索引等,提高数据库的响应速度。可以使用数据库性能监控工具来分析数据库的性能问题,并采取相应的优化措施。

(三)事务死锁问题

事务死锁是指两个或多个事务相互等待对方释放资源,从而导致所有事务都无法继续执行的情况。以下是一些可能的原因和解决方案:

  1. 并发事务的资源竞争:如果多个事务同时访问和修改相同的资源,可能会导致资源竞争,从而引发死锁。检查业务逻辑,尽量减少并发事务对相同资源的竞争。可以考虑使用乐观锁、悲观锁等技术来控制资源的访问。
  2. 事务隔离级别设置不当:如果事务隔离级别设置得过高,可能会导致事务之间的锁等待时间过长,增加死锁的风险。检查事务隔离级别设置,根据实际情况选择合适的隔离级别。一般来说,较低的隔离级别可以减少锁的竞争,但可能会导致数据不一致的问题。
  3. 数据库索引不合理:如果数据库索引不合理,可能会导致 SQL 查询执行时间过长,增加事务死锁的风险。检查数据库索引,确保索引的合理性和有效性。可以使用数据库性能分析工具来分析 SQL 查询的执行计划,优化索引。
  4. 事务超时时间设置不当:如果事务超时时间设置得太长,可能会导致死锁的事务长时间占用资源,影响其他事务的执行。检查事务超时时间设置,根据实际情况调整超时时间。可以适当缩短超时时间,以便及时释放死锁的事务。

七、总结

Spring 事务与 MySQL 事务的结合为企业级应用开发提供了强大的事务管理功能。通过理解事务的基本概念、MySQL 事务的实现和隔离级别、Spring 事务的原理和使用方法,以及它们之间的协同工作,开发者可以更好地运用事务处理机制,确保数据的一致性和完整性。在实际项目中,需要根据业务需求和性能要求选择合适的事务传播行为和隔离级别,并注意解决事务不生效、超时和死锁等常见问题。通过合理地配置和使用 Spring 事务和 MySQL 事务,可以提高应用的可靠性和性能,为用户提供更好的服务。

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

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

相关文章

Linux环境变量进程地址空间

目录 一、初步认识环境变量 1.1常见的环境变量 1.2环境变量的基本概念 二、命令行参数 2.1通过命令行参数获取环境变量 2.2本地变量和内建命令 2.3环境变量的获取 三、进程地址空间 3.1进程&#xff08;虚拟&#xff09;地址空间的引入 3.2进程地址空间的布局和理解 …

【机器学习】:深潜智能的底层逻辑、前沿探索与未来展望】

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 在科技的浩瀚星空中&#xff0c;机器学习犹如一颗璀璨的新星&#xff0c;以其独特的魅力和无限潜力&#xff0c;引领着我们向智能的深处探索。今天&#xff0c;我们将一同踏上这场深度之旅&#xff0c;不仅解析…

pdf图片怎么提取出来?这6个pdf图片提取工具全搞定,值得推荐!

在我们的日常办公和学习中&#xff0c;pdf文件成为了信息传递的重要载体。然而&#xff0c;有时我们在pdf文档中发现一些精彩的图片&#xff0c;想将其提取出来供个人使用或分享给他人。无论是为了更灵活的处理&#xff0c;还是为了发送特定的图像&#xff0c;提取pdf中的图片都…

国产新港海岸NCS8622Type-C/DP1.4 to HDMI2.0 Converter

NCS8622是一款高性能低功耗的Type-C/DP1.4至HDMI2.0转换器&#xff0c;设计用于将USB Type-C源或DP1.4源连接到HDMI2.0。
 NCS8622集成了符合DP1.4标准的接收器和符合HDMI2.0标准的发射器。 此外&#xff0c;CC控制器用于CC通信以实现DP替代模式。
 DP接收器集成了HDCP 1.…

gazebo 仿真阶段性问题汇总二

目录 写在前面的话遇到的问题问题一&#xff1a;启动了多个 robot_state_publisher解决办法 问题二&#xff1a;rviz 启动报错解决办法 问题三&#xff1a;rviz 中 wheel 一直指向 base_link解决方法 问题四&#xff1a;摄像头和opencv坐标系的问题解决方法 问题五&#xff1a;…

Submariner 部署全过程

Submariner 部署全过程 部署集群配置 broker 集群&#xff1a; pod-cidr&#xff1a;11.244.0.0/16 service-cidr 11.96.0.0/12 broker 172.100.0.109 node 172.100.0.108 集群 1&#xff08; pve3 &#xff09;&#xff1a; pod-cidr&#xff1a;10.244.0.0/16 service-…

微信支付开发-支付工厂JsApi产品代码

一、JSAPI支付产品、APP支付产品、小程序支付产品流程图 二、H5支付产品、Native支付产品 三、工厂父类抽象类代码开发 <?php /*** 微信父类抽象类* User: 龙哥三年风水* Date: 2024/9/19* Time: 11:33*/ namespace Payment\WechatPay; abstract class WechatPaymentHandl…

翻页时钟 2.0-自动置顶显示,点击小时切换显示标题栏不显示标题栏-供大家学习研究参考

更新内容 自动置顶显示点击小时切换显示标题栏&#xff0c;&#xff08;显示标题栏后可移动时钟位置&#xff0c;鼠标拖动边框调整时钟大小&#xff09;不显示标题栏时&#xff0c;透明部分光标可穿透修正一个显示bu 下载地址&#xff1a; https://download.csdn.net/download…

一站式项目管理系统如何实现全链条数字化管理?

在当今数字化高速发展的时代&#xff0c;项目申报领域也面临着管理方式的革新挑战。从传统的人工管理到如今追求高效、精准的数字化管理模式转变&#xff0c;是行业发展的必然趋势。如启服云项目管理系统之类的出现&#xff0c;为项目申报管理带来了新的思路。 立项阶段的数字化…

假期学习笔记总结--iOS 自动释放池

iOS 自动释放池 https://juejin.cn/post/6844904094503567368#heading-23 ARC和MRC 苹果在 iOS 5 中引入了ARC&#xff08;Automatic Reference Counting&#xff09;自动引用计数内存管理技术&#xff0c;通过LLVM编译器和Runtime协作来进行自动管理内存。LLVM编译器会在编…

怎么把图片压缩变小?把图片压缩变小的八种压缩方法介绍

怎么把图片压缩变小&#xff1f;在当今这个信息高度共享的时代&#xff0c;图片不仅仅是简单的视觉元素&#xff0c;它们承载着我们的记忆、故事和创意。无论是旅行的风景、家庭的聚会&#xff0c;还是工作中的项目展示&#xff0c;图片都在我们的生活中扮演着不可或缺的角色。…

文达通从创业板、北交所转战港股:净利润下滑,资产负债率124%

《港湾商业观察》施子夫 8月13日&#xff0c;青岛文达通科技股份有限公司&#xff08;以下简称&#xff0c;文达通&#xff09;递表港交所获受理&#xff0c;联席保荐机构为山证国际、浤博资本。 在选择递表港交所前&#xff0c;文达通曾于新三板挂牌上市并且还曾尝试谋求创业…

智谱清影 -CogVideoX-2b-部署与使用,带你揭秘生成6s视频的极致体验!

文章目录 1 效果展示2 CogVideoX 前世今生3 CogVideoX 部署实践流程3.1 创建丹摩实例3.2 配置环境和依赖3.3 模型与配置文件3.4 运行4 遇到问题 1 效果展示 A street artist, clad in a worn-out denim jacket and a colorful bandana, stands before a vast concrete wall in …

产品:直播送礼延迟这么大,你就不能快点吗

先赞后看&#xff0c;南哥助你Java进阶一大半 其实抖音的实时音视频技术RTC&#xff0c;是来源于火山引擎RTC的支持&#xff0c;抖音、火山引擎、巨量引擎都属于字节旗下不同的业务板块。 我是南哥&#xff0c;一个Java学习与进阶的领路人。 相信对你通关面试、拿下Offer进入心…

俄罗斯电商Ozon实用运营工具推荐

想要在俄罗斯最大的跨境电商平台 Ozon 上大展拳脚&#xff0c;却对俄语感到无从下手&#xff1f;又或是担心难以把握俄罗斯市场的热点趋势&#xff1f;别担心&#xff01;在这篇文章中&#xff0c;我们将为你介绍一系列实用工具&#xff0c;涵盖翻译、运营和图片处理等方面&…

有源滤波器UAF42

有源滤波器模块&#xff0c;在电路板上同时实现了低通&#xff0c;高通&#xff0c;带通 滤波器&#xff0c;可选其一进行输出&#xff0c;并可通过改变滑变阻值&#xff0c;轻松调节其滤波器中心频率&#xff0c;Q值&#xff0c;通带增益等&#xff0c; 也可方便实现Butterwo…

深度学习基础案例5--VGG16人脸识别(体验学习的痛苦与乐趣)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 这次目标本来要达到60%&#xff0c;但是却非常稳定的达到了40%&#xff0c;​&#x1f622;​​&#x1f622;​​&#x1f622;​​&#x1f622;​&am…

实战17-NavBar+Vip布局

NavBar.ets import { PADDING } from ../../constants/size import rvp from ../../utils/resposive/rvIndexComponent export default struct NavBar {StorageProp(topHeight) topHeight: number 0;build() {Row() {Row({ space: rvp(6) }) {Text(请选择地址).fontSize(rvp(1…

Java-测试-Mockito 入门篇

之前很长一段时间我都认为测试就是使用SpringBootTest类似下面的写法&#xff1a; SpringBootTest class SysAuthServiceTest {AutowiredSysRoleAuthMapper sysRoleAuthMapper;Testpublic void test() {QueryWrapper<SysRoleAuth> queryWrapper new QueryWrapper<&g…

Web开发:Thymeleaf模板引擎

1. Thymeleaf 简介 Thymeleaf 是一个现代的服务器端模板引擎&#xff0c;用于生成 HTML、XML、JavaScript 和 CSS。它的设计理念是使模板能够自然地在 Web 浏览器中呈现&#xff0c;同时允许动态生成内容。 2. 最佳实践总结 2.1 项目结构和模板组织 保持清晰的目录结构&…