spring事务 @Transactional

文章目录

  • 1. 简介
    • 1.1 什么是事务
    • 1.2 什么是Spring事务管理
    • 1.3 @Transactional注解的作用
  • 2. @Transactional注解的使用
    • 2.1 如何在Spring中使用@Transactional
    • 2.2 @Transactional的属性配置
  • 3. @Transactional的工作原理
    • 3.1 Spring如何管理事务
    • 3.2 @Transactional的底层实现
  • 4. @Transactional的传播行为
    • 4.1 传播行为的种类
    • 4.2 每种传播行为的具体作用和使用场景
  • 5. @Transactional的隔离级别
    • 5.1 事务的隔离级别有哪些
    • 5.2 如何在@Transactional中设置隔离级别
  • 6. @Transactional的只读设置
    • 6.1 什么是只读事务
    • 6.2 如何在@Transactional中设置只读
  • 7. @Transactional的回滚规则
    • 7.1 默认的回滚规则是什么
    • 7.2 如何自定义回滚规则
  • 8. @Transactional的常见问题
    • 8.1 @Transactional不生效的原因及解决办法
      • 8.1.1 原因1:事务管理器配置错误或缺失
      • 8.1.2 原因2:使用@Transactional注解的方法在同一个类中调用
      • 8.1.3 原因3:事务传播行为配置不正确
    • 8.2 @Transactional的使用注意事项
  • 9.实例

1. 简介

1.1 什么是事务

在计算机科学中,事务通常指的是一系列操作,这些操作作为一个整体一起执行,要么全部成功,要么全部失败。事务是保证数据一致性的一种机制,它有四个基本特性,通常被称为ACID属性:

  • 原子性(Atomicity):事务是一个原子操作单元,其对数据的修改要么全都执行,要么全都不执行。
  • 一致性(Consistency):事务必须使数据库从一个一致性状态变换到另一个一致性状态。
  • 隔离性(Isolation):在并发环境中,一个事务的执行不应该被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
  • 持久性(Durability):一旦事务完成(即成功提交),其结果就必须能够永久保存在数据库中。

1.2 什么是Spring事务管理

Spring事务管理是Spring框架中的一个重要组成部分,它提供了一种抽象机制来管理事务。Spring事务管理可以处理编程式和声明式的两种事务管理方式。

编程式事务管理:这种方式需要在代码中明确地进行事务管理,包括开始事务、提交事务、回滚事务等。

声明式事务管理:这种方式只需要通过注解或XML配置来管理事务,无需在代码中进行事务管理。这种方式的主要优点是不需要编写大量的事务管理代码,使业务代码更加简洁、清晰。

在Spring中,最常用的声明式事务管理方式就是使用@Transactional注解。

1.3 @Transactional注解的作用

在Spring框架中,@Transactional是用于管理事务的关键注解。它可以应用于接口定义、类定义、公开方法上。最常见的使用场景是在服务层的方法上使用@Transactional注解来控制事务。

当在方法上使用@Transactional注解时,Spring会为这个方法创建一个代理,当这个方法被调用时,代理会首先启动一个新的事务,然后调用原始的方法。如果这个方法成功完成(即没有抛出异常),代理会提交事务;如果这个方法抛出了异常,代理会回滚事务。

通过使用@Transactional注解,我们可以很方便地进行事务控制,无需在业务代码中添加大量的事务管理代码,使代码更加简洁、清晰。

2. @Transactional注解的使用

2.1 如何在Spring中使用@Transactional

在Spring框架中,我们可以通过在方法上使用@Transactional注解来声明该方法是事务性的。当这个方法被调用时,Spring就会为这个方法创建一个事务。

例如,我们可以在一个服务类中的方法上使用@Transactional注解:

@Service
public class UserService {@Autowiredprivate UserRepository userRepository;@Transactionalpublic void createUser(User user) {userRepository.save(user);}
}

在上述代码中,createUser方法被@Transactional注解,所以当调用createUser方法时,Spring会为这个方法创建一个事务。

2.2 @Transactional的属性配置

@Transactional注解包含一些属性,我们可以通过设置这些属性来改变事务的行为。

  • propagation:事务的传播行为。默认值是Propagation.REQUIRED,表示如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
  • isolation:事务的隔离级别。默认值是Isolation.DEFAULT,表示使用底层数据库的默认隔离级别。
  • timeout:事务的超时时间。默认值是-1,表示永不超时。
  • readOnly:是否为只读事务。默认值是false,表示这是一个读写事务。
  • rollbackFor:需要进行回滚的异常类数组。默认值是空数组,表示所有的RuntimeException及其子类都会导致事务回滚。
  • noRollbackFor:不需要进行回滚的异常类数组。默认值是空数组。

例如,我们可以这样配置@Transactional注解:

@Transactional(propagation = Propagation.REQUIRES_NEW,isolation = Isolation.READ_COMMITTED,timeout = 3600,readOnly = false,rollbackFor = {CustomException.class},noRollbackFor = {AnotherCustomException.class})
public void someMethod() {// ...
}

在上述代码中,我们设置了@Transactional注解的各种属性,包括传播行为、隔离级别、超时时间、是否只读以及回滚规则。

3. @Transactional的工作原理

3.1 Spring如何管理事务

Spring的事务管理分为编程式事务管理和声明式事务管理两种。编程式事务管理需要在代码中显式地进行事务管理,而声明式事务管理则通过注解或XML配置来管理事务,大大简化了事务管理的复杂性。

Spring的事务管理是通过AOP(面向切面编程)来实现的。当你在一个方法上使用@Transactional注解时,Spring会在运行时为这个方法创建一个代理对象,这个代理对象会包含事务管理的代码。当你调用这个方法时,实际上是调用了代理对象的方法。

在代理对象的方法中,Spring会首先检查当前是否存在一个事务。如果不存在,Spring会创建一个新的事务。然后,Spring会执行你的方法。如果你的方法执行成功,Spring会提交事务;如果你的方法执行失败,并抛出了未被捕获的异常,Spring会回滚事务。

3.2 @Transactional的底层实现

@Transactional注解的实现主要依赖于Spring的AOP和事务管理器。

当Spring启动时,它会创建一个AnnotationTransactionAttributeSource的实例,这个实例会找到所有使用了@Transactional注解的方法,并为这些方法生成相应的事务属性定义。

然后,Spring会创建一个TransactionInterceptor的实例,这个拦截器会在运行时拦截到所有的事务方法调用,并根据事务属性定义来决定如何处理事务。

最后,Spring会创建一个ProxyFactoryBean的实例,这个实例会为所有的事务方法生成代理对象。这些代理对象会在调用事务方法时,首先调用`Transaction

4. @Transactional的传播行为

4.1 传播行为的种类

在Spring的@Transactional注解中,传播行为(propagation behavior)定义了事务的边界。Spring定义了7种传播行为:

  1. Propagation.REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
  2. Propagation.SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
  3. Propagation.MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。
  4. Propagation.REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
  5. Propagation.NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  6. Propagation.NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
  7. Propagation.NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与Propagation.REQUIRED类似的操作。

4.2 每种传播行为的具体作用和使用场景

  • Propagation.REQUIRED:这是最常用的传播行为。在大多数情况下,我们希望如果一个事务已经存在,那么就在这个事务中执行;否则,就创建一个新的事务。

  • Propagation.SUPPORTS:这种传播行为在调用者并不一定需要事务,但是如果有现成的事务可以加入,那么就使用它。如果没有事务,那么就按非事务方式执行。

  • Propagation.MANDATORY:这种传播行为适用于如果没有一个已经存在的事务,那么就抛出异常的情况。也就是说,这个方法必须在一个已经存在的事务中执行。

  • Propagation.REQUIRES_NEW:这种传播行为在每次都需要创建一个新的事务,并且也会将当前的事务(如果存在)挂起,直到新的事务完成。这种传播行为适用于需要在自己的新事务中执行的情况。

  • Propagation.NOT_SUPPORTED:这种传播行为适用于不需要事务的情况。如果有一个已经存在的事务,那么这个事务会被挂起,直到这个方法执行完成。

  • Propagation.NEVER:这种传播行为适用于如果存在一个事务,那么就抛出异常的情况。也就是说,这个方法必须在没有事务的情况下执行。

  • Propagation.NESTED:这种传播行为适用于需要在一个嵌套事务中执行的情况。如果当前的事务存在,那么就在这个事务的嵌套事务中执行。如果当前的事务不存在,那么就创建一个新的事务。这种传播行为需要特定的事务管理器支持。

5. @Transactional的隔离级别

事务的隔离级别是用来解决事务并发执行时可能出现的问题,如脏读、不可重复读、幻读等。不同的隔离级别提供了不同程度的隔离。在Spring的@Transactional注解中,可以通过设置隔离级别来控制事务的隔离程度。

5.1 事务的隔离级别有哪些

事务的隔离级别主要有以下四种:

  1. ISOLATION_READ_UNCOMMITTED(读未提交):这是最低的隔离级别。允许一个事务读取另一个事务未提交的数据。可能导致脏读、不可重复读和幻读。
  2. ISOLATION_READ_COMMITTED(读已提交):这个隔离级别允许一个事务读取另一个事务已提交的数据。可以避免脏读,但仍可能导致不可重复读和幻读。
  3. ISOLATION_REPEATABLE_READ(可重复读):这个隔离级别确保一个事务在整个过程中多次读取同一行数据时,每次读取的结果都是相同的。可以避免脏读和不可重复读,但仍可能导致幻读。
  4. ISOLATION_SERIALIZABLE(串行化):这是最高的隔离级别。它要求事务序列化执行,即一个事务只能在另一个事务完成后才能开始。可以避免脏读、不可重复读和幻读,但执行效率较低。

5.2 如何在@Transactional中设置隔离级别

@Transactional注解中,可以通过设置isolation属性来指定事务的隔离级别。例如:

@Transactional(isolation = Isolation.READ_COMMITTED)
public void someMethod() {// 业务逻辑
}

在这个例子中,someMethod方法的事务隔离级别被设置为READ_COMMITTED。当然,你可以根据实际需求选择其他的隔离级别。需要注意的是,不同的数据库可能支持不同的隔离级别,因此在设置隔离级别时,需要考虑数据库的实际支持情况。

6. @Transactional的只读设置

在Spring的@Transactional注解中,可以通过设置readOnly属性来指定事务是否为只读。只读事务可以帮助数据库引擎优化事务,提高查询速度。

6.1 什么是只读事务

只读事务是指该事务只进行数据的读取操作,不进行任何的数据修改操作(包括:INSERT、UPDATE、DELETE等)。在某些场景下,我们知道事务只需要读取数据,不需要修改数据,这时,我们可以将事务设置为只读,以帮助数据库做一些优化,比如避免一些不必要的锁操作,从而提高查询效率。

6.2 如何在@Transactional中设置只读

@Transactional注解中,可以通过设置readOnly属性来指定事务是否为只读。例如:

@Transactional(readOnly = true)
public void someMethod() {// 业务逻辑
}

在这个例子中,someMethod方法的事务被设置为只读。这意味着,在这个事务中,我们只能进行数据的查询操作,不能进行数据的修改操作。

需要注意的是,这个只读设置只是一个提示,具体的行为可能会根据实际的事务管理器的实现有所不同。例如,某些事务管理器可能会在只读事务中允许进行数据的修改操作,但这通常不是一个好的做法,因为它可能会导致数据的不一致。所以,当我们将一个事务设置为只读时,我们应该确保在事务中不进行任何数据的修改操作。

7. @Transactional的回滚规则

在Spring的@Transactional注解中,可以通过设置rollbackFornoRollbackFor属性来自定义事务的回滚规则。回滚规则决定了在哪些异常情况下事务需要回滚,哪些异常情况下事务可以继续提交。

7.1 默认的回滚规则是什么

默认情况下,@Transactional注解的回滚规则是:当事务中发生运行时异常(RuntimeException)或者错误(Error)时,事务会回滚;当发生受检异常(Checked Exception)时,事务不会回滚。

7.2 如何自定义回滚规则

@Transactional注解中,可以通过设置rollbackFornoRollbackFor属性来自定义事务的回滚规则。例如:

@Transactional(rollbackFor = {CustomException.class}, noRollbackFor = {AnotherCustomException.class})
public void someMethod() {// 业务逻辑
}

在这个例子中,我们为someMethod方法自定义了回滚规则:

  1. 当方法抛出CustomException异常时,事务会回滚。这里的CustomException可以是任何继承自Throwable的自定义异常类。
  2. 当方法抛出AnotherCustomException异常时,事务不会回滚。同样,AnotherCustomException可以是任何继承自Throwable的自定义异常类。

通过这种方式,我们可以根据实际需求灵活地自定义事务的回滚规则。需要注意的是,如果同时设置了rollbackFornoRollbackFor,那么noRollbackFor的优先级更高,即如果一个异常同时满足rollbackFornoRollbackFor的条件,那么事务不会回滚。

8. @Transactional的常见问题

在使用@Transactional注解时,可能会遇到一些常见的问题。本节将介绍@Transactional不生效的原因及解决办法,以及使用@Transactional的注意事项。

8.1 @Transactional不生效的原因及解决办法

8.1.1 原因1:事务管理器配置错误或缺失

如果事务管理器没有正确配置或者缺失,@Transactional注解将无法正常工作。

解决办法:确保已经正确配置了事务管理器。对于Spring Boot项目,通常会自动配置事务管理器。对于非Spring Boot项目,需要手动配置事务管理器,例如:

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/>
</bean>

8.1.2 原因2:使用@Transactional注解的方法在同一个类中调用

当一个没有使用@Transactional注解的方法调用同一个类中的使用@Transactional注解的方法时,事务注解不会生效。

解决办法1:将使用@Transactional注解的方法移到另一个类中,然后在原类中通过依赖注入的方式调用这个方法。例如:

@Service
public class AService {@Autowiredprivate BService bService;public void methodA() {bService.methodB();}
}@Service
public class BService {@Transactionalpublic void methodB() {// 业务逻辑}
}

解决办法2:将使用 SpringContextUtil.getBean(this.getClass()).methodB()从spring中再获取一边当前bean的代理对象并调用。例如:

@Service
public class BService {public void methodA() {SpringContextUtil.getBean(this.getClass()).methodB();}@Transactionalpublic void methodB() {// 业务逻辑}
}

在Spring中,当一个类中的一个方法调用另一个带有@Transactional注解的方法时,通常情况下,@Transactional注解不会生效。这是因为Spring事务管理是基于代理的,当一个方法内部调用另一个方法时,实际上是在同一个对象实例上进行的调用,而不是通过代理对象。因此,事务管理功能不会被触发。

然而,通过使用SpringContextUtil.getBean(this.getClass()).methodB();这种写法,我们可以绕过这个限制。这是因为SpringContextUtil.getBean(this.getClass())会从Spring容器中获取当前类的代理对象,然后通过这个代理对象调用methodB()方法。由于调用是通过代理对象进行的,因此@Transactional注解会生效,触发事务管理功能。

请注意,这种写法虽然可以解决问题,但并不是最佳实践。在实际项目中,我们应该尽量避免在一个类的方法中直接调用另一个带有@Transactional注解的方法。更好的做法是将这两个方法分别放在不同的服务类中,然后通过依赖注入的方式来调用这些服务类的方法。这样可以更好地遵循单一职责原则,使代码更加清晰和可维护。

8.1.3 原因3:事务传播行为配置不正确

如果事务传播行为配置不正确,可能会导致@Transactional注解不生效。

解决办法:检查@Transactional注解的propagation属性设置,确保它符合实际需求。根据不同的业务场景,选择合适的事务传播行为。

8.2 @Transactional的使用注意事项

  1. 确保事务管理器配置正确。对于Spring Boot项目,通常会自动配置事务管理器。对于非Spring Boot项目,需要手动配置事务管理器。

  2. 避免在同一个类中调用使用@Transactional注解的方法。将使用@Transactional注解的方法移到另一个类中,然后在原类中通过依赖注入的方式调用这个方法。

  3. 根据实际需求,合理设置事务的传播行为、隔离级别、超时时间、只读属性等。

  4. 不要在privateprotectedfinal方法上使用@Transactional注解,因为这些方法无法被代理,导致@Transactional注解无法生效。

  5. 如果需要自定义事务的回滚规则,可以通过设置rollbackFornoRollbackFor属性来实现。注意noRollbackFor的优先级更高。

  6. 在使用@Transactional注解时,尽量遵循最小化事务范围的原则,即只在需要进行事务控制的方法上使用@Transactional注解。这样可以降低事务的开销,提高系统性能。

假设我们正在开发一个电商系统,系统中有一个订单服务(OrderService)和库存服务(InventoryService)。当用户下单时,需要同时更新订单和库存信息。为了保证数据的一致性,我们可以使用@Transactional注解来确保这两个操作在同一个事务中完成。如果其中一个操作失败,整个事务将回滚,从而避免数据不一致的问题。

首先,我们创建订单服务(OrderService)和库存服务(InventoryService):

@Service
public class OrderService {public void createOrder() {// 创建订单的逻辑}
}@Service
public class InventoryService {public void updateInventory() {// 更新库存的逻辑}
}

9.实例

接下来,我们创建一个业务服务(BusinessService),该服务将负责调用订单服务和库存服务。在该服务中,我们使用@Transactional注解来确保这两个操作在同一个事务中完成:

@Service
public class BusinessService {@Autowiredprivate OrderService orderService;@Autowiredprivate InventoryService inventoryService;@Transactionalpublic void placeOrder() {try {orderService.createOrder();inventoryService.updateInventory();} catch (Exception e) {// 处理异常,例如记录日志等throw e;}}
}

现在,当我们调用BusinessServiceplaceOrder方法时,订单创建和库存更新操作将在同一个事务中进行。如果其中一个操作失败,整个事务将回滚,从而确保数据的一致性。

这个例子展示了如何使用@Transactional注解解决实际问题。在实际项目中,我们可以根据业务需求灵活地使用@Transactional注解来控制事务,确保数据的一致性和完整性。

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

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

相关文章

数学建模·灰色关联度

灰色关联分析 基本原理 灰色关联分析可以确定一个系统中哪些因素是主要因素&#xff0c;哪些是次要因素&#xff1b; 灰色关联分析也可以用于综合评价&#xff0c;但是由于数据预处理的方式不同&#xff0c;导致结果 有较大出入 &#xff0c;故一般不采用 具体步骤 数据预处理…

wps批量删除空白单元格

目录 原始数据1.按ctrlg键2.选择“空值”&#xff0c;点击“定位”3. 右击&#xff0c;删除单元格修改后的数据 原始数据 1.按ctrlg键 2.选择“空值”&#xff0c;点击“定位” 如图所示&#xff0c;空值已被选中 3. 右击&#xff0c;删除单元格 修改后的数据

微软Office PLUS办公插件下载安装指南

微软OfficePLUS插件下载安装指南 简介&#xff1a; OfficePLUS微软官方出品的Office插件 &#xff0c;OfficePLUS拥有30万高质量模板素材&#xff0c;能帮助Word、Excel、Powerpoint、PDF等多种办公软件提升效率&#xff0c;具有智能化、模板质量高、运行快、稳定性强等优点。…

抽象工厂模式与工厂方法(简单工厂)的区别

在软件开发中&#xff0c;简单工厂模式和工厂方法模式是两种常用的创建型设计模式。尽管它们都用于创建对象&#xff0c;但它们的实现方式和应用场景有所不同。本文将详细探讨这两种模式的区别&#xff0c;帮助你更好地理解和应用它们。 简单工厂模式 简单工厂模式&#xff0…

昇思25天学习打卡营第11天|RNN实现情感分类

概述 情感分类是自然语言处理中的经典任务&#xff0c;是典型的分类问题。本节使用MindSpore实现一个基于RNN网络的情感分类模型&#xff0c;实现如下的效果&#xff1a; 输入: This film is terrible 正确标签: Negative 预测标签: Negative输入: This film is great 正确标…

Mongodb复合索引

学习mongodb&#xff0c;体会mongodb的每一个使用细节&#xff0c;欢迎阅读威赞的文章。这是威赞发布的第90篇mongodb技术文章&#xff0c;欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题&#xff0c;欢迎在文章下面点个赞&#xff0c;或者关…

【计算机毕业设计】002基于weixin小程序家庭记账本

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

【实战:python-Django发送邮件-短信-钉钉通知】

一 Python发送邮件 1.1 使用SMTP模块发送邮件 import smtplib from email.mime.text import MIMEText from email.header import Headermsg_from 306334678qq.com # 发送方邮箱 passwd luzdikipwhjjbibf # 填入发送方邮箱的授权码(填入自己的授权码&#xff0c;相当于邮箱…

鸿蒙语言基础类库:【@ohos.uitest (UiTest)】 测试

UiTest UiTest提供模拟UI操作的能力&#xff0c;供开发者在测试场景使用&#xff0c;主要支持如点击、双击、长按、滑动等UI操作能力。 该模块提供以下功能&#xff1a; [By]&#xff1a;提供控件特征描述能力&#xff0c;用于控件筛选匹配查找。[UiComponent]&#xff1a;代…

实验四:图像的锐化处理

目录 一、实验目的 二、实验原理 1. 拉普拉斯算子 2. Sobel算子 3. 模板大小对滤波的影响 三、实验内容 四、源程序和结果 (1) 主程序(matlab) (2) 函数GrayscaleFilter (3) 函数MatrixAbs 五、结果分析 1. 拉普拉斯滤波 2. Sobel滤波 3. 不同大小模板的滤波…

单点登陆思路及流程

单点登录&#xff08;Single Sign-On&#xff0c;简称SSO&#xff09;是一种流行的身份验证和授权机制&#xff0c;允许用户通过一次登录获得对多个应用程序或系统的访问权限。实现单点登录可以提高用户体验、简化用户管理和减少密码重复输入等问题。下面是一种常见的单点登录实…

昇思25天学习打卡营第7天 | 基于MindSpore的GPT2文本摘要

本次打卡基于gpt2的文本摘要 数据加载及预处理 from mindnlp.utils import http_get# download dataset url https://download.mindspore.cn/toolkits/mindnlp/dataset/text_generation/nlpcc2017/train_with_summ.txt path http_get(url, ./)from mindspore.dataset impor…

以太坊(以太坊solidity合约)

以太坊&#xff08;以太坊solidity合约&#xff09; 1&#xff0c;以太坊2&#xff0c;开发名词解释&#xff08;1&#xff09;钱包&#xff08;2&#xff09;Solidity&#xff08;3&#xff09;Ether&#xff08;以太币&#xff09;&#xff08;4&#xff09;Truffle&#xff…

Redis 7.x 系列【23】哨兵模式

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 工作原理2.1 监控2.2 标记下线2.3 哨兵领袖2.4 新的主节点2.5 通知更新 3. …

请求响应(后端必备)

一、请求 1.简单参数 原始方式&#xff1a; 在原始的web程序中&#xff0c;获取请求参数&#xff0c;需要通过HttpServletRequest对象手动获取 RequestMapping("/simpleParam")public String simpleParam(HttpServletRequest request){String name request.getP…

什么叫价内期权?直接带你了解期权价内期权怎么使用?!

今天带你了解什么叫价内期权&#xff1f;直接带你了解期权价内期权怎么使用&#xff1f;&#xff01;价内期权是具有内在价值的期权。期权持有人行权时&#xff0c;对看涨期权而言&#xff0c;行权价格低于标的证券结算价格&#xff1b;对看跌期权而言&#xff0c;标的证券结算…

js 请求blob:https:// 图片

方式1 def get_file_content_chrome(driver, uri):result driver.execute_async_script("""var uri arguments[0];var callback arguments[1];var toBase64 function(buffer){for(var r,nnew Uint8Array(buffer),tn.length,anew Uint8Array(4*Math.ceil(t/…

前端Vue组件化实践:自定义加载组件的探索与应用

在前端开发领域&#xff0c;随着业务逻辑复杂度的提升和系统规模的不断扩大&#xff0c;传统的开发方式逐渐暴露出效率低下、维护困难等问题。为了解决这些挑战&#xff0c;组件化开发作为一种高效、灵活的开发模式&#xff0c;受到了越来越多开发者的青睐。本文将结合实践&…

Java基础及进阶

JAVA特性 基础语法 一、Java程序的命令行工具 二、final、finally、finalize 三、继承 class 父类 { //代码 }class 子类 extends 父类 { //代码 }四、Vector、ArrayList、LinkedList 五、原始数据类型和包装类 六、接口和抽象类 JAVA进阶 Java引用队列 Object counter ne…

PostgreSQL行级安全策略探究

前言 最近和朋友讨论oracle行级安全策略(VPD)时&#xff0c;查看了下官方文档&#xff0c;看起来VPD的原理是针对应用了Oracle行级安全策略的表、视图或同义词发出的 SQL 语句动态添加where子句。通俗理解就是将行级安全策略动态添加为where 条件。那么PG中的行级安全策略是怎…