使用切面AOP实现全局乐观锁

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

最近项目需要版本号乐观锁,但发现每个需要加锁的地方都要做处理发现很繁琐很臃肿,所以使用aop切面+自定义注解来抽取实现乐观锁。

第一步使用@Aspect需要pom引入

<!--使用AspectJ方式注解需要相应的包-->
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjrt</artifactId>
    <version>1.9.1</version>
</dependency>
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.1</version>
</dependency>

 

第二步: 自定义注解

package com.aop;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
 * 自定义尝试切面接口
 */
// 注解会在class字节码文件
并发锁事务重试机制(JPA高并发下的乐观锁异常)           我的博文中,有一篇短文Java结合Junit做并发测试用例,是介绍JPA在高并发下,多个Service方法更新 同一个记录;在异常信息中有StaleObjectStateException和ObjectOptimisticLockingFailureException异常信 息。有些业务这种靠JPA维护的版本信息是可行的,如果两个不同用户同事(高并发)购买一件马丁靴鞋... 阅读详情

相关推荐

瑞芯微RK3506开发板DSM音频开发避坑指南:从硬件改接到内核配置全流程

本文详细解析了在瑞芯微RK3506开发板上进行DSM音频开发的完整流程与关键避坑点。内容涵盖从硬件改造(如电阻焊接)、内核驱动配置(DTS参数、补丁应用)到系统调试与波形分析的全过程,旨在帮助嵌入式开发者高效实现高信噪比、低成本的音频方案,避免常见错误。

weixin_29164091的博客 380

数据乐观锁版本号

通过jmeter 1s 1000线程测试。结合官网问题排查增加乐观锁拦截器。

qq_45604653的博客 564

voc与txt互转

voc2txt # coding:utf-8 from __future__ import print_function import os import random import glob import xml.etree.ElementTree as ET def xml_reader(filename): """ Parse a PASCAL VOC xml file """ tree = ET.parse(filename) size = tree.find('siz

weixin_44898889的博客 815

AOP参数

在面试中,可能会问道AOP的适用场景有哪些,参数验就是其中的一个例子在Java使用登录or注册功能时,会需要用户提交邮箱手机号等信息,此时前端可能会做参数验,以下代码是基于后端的参数验,可适用于大部分场景。

weixin_63802890的博客 1924

乐观锁思想在JAVA中的实现——CAS

生活中我们看待一个事物总有不同的态度,比如半瓶水,悲观的人会觉得只有半瓶水了,而乐观的人则会认为还有半瓶水呢。很多技术思想往往源于生活,因此在多个线程并发访问数据的时候,有了悲观锁和乐观锁。悲观锁和乐观锁其实本质都是一种思想,在JAVA中对于悲观锁的实现大家可能都很了解,可以通过、加锁实现,本文不展开讲解了。那么乐观锁在JAVA中是如何实现的呢?底层的实现机制又是什么呢?我们用一个账户取钱的例子来说明乐观锁和悲观锁的问题。 账户类,方法是取钱方法。 账户默认有10000元,1000个线

BASK2311的博客 977

基于SpringAOP切面,自定义注解 实现Mysql乐观锁重试机制(亲测可用)

案例说明: 银行两操作员同时操作同一账户。 比如A、B操作员同时读取一余额为1000元的账户,A操作员为该账户增加100元,B操作员同时为该账户扣除50元,A先提交,B后提交。最后实际账户余额为1000-50=950元,但本该为1000+100-50=1050。这就是典型的并发问题。 乐观锁机制在一定程度上解决了这个问题。乐观锁,大多是基于数据版本(Version)记录机制实现。何谓数据版本?...

一尘在心的博客 1735

SpringBoot入门学习笔记-18-MybatisPlus乐观锁Update方法封装

每次更新时,version都会更新,比如自动=1.这样下次再更新时,由于version已经变了就不会被更新了。这样可以确认每一次的更新都能在对的版本上,如果版本不对,就需要重新获取数据。4、在通用update方法中,beforeUpdateComm中调用一个通用处理方法,用来确保所以有update方法都会得到执行beforeUpdateCommHandle。mybatisPlus 的自带了乐观锁的功能,一般使用int 类型的version当版本号,或者用updateTime来当版本号

Java自学笔记-springBoot微服务 1706

SpringBoot Mybatis 乐观锁重试机制代码实现

乐观锁重试机制代码实现乐观锁,那当然也是有悲观锁的 悲观锁和乐观锁的原理和应用场景 悲观锁(Pessimistic Lock) 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。 乐观锁(Optimis...

帅大叔的博客 1万+

【转】Spring Boot 乐观锁加锁失败 - 使用AOP恢复错误

之前写了一些辅助工作相关的Spring Boot怎么使用AOP。这里继续正题,怎么减少Spring Boot 乐观锁加锁报错的情况(基本可以解决)。 1. 包依赖 spring-boot-starter-data-jpa, Spring Boot的JPA starter h2, H2内存数据库 spring-boot-starter-test,Spring Boo...

Jomly Kellenda的博客 616

JAVA-乐观锁更新失败或业务异常后接口重试

最近在阅读《阿里巴巴Java开发手册》时有这么一段内容: 【强制】并发修改同一记录时,避免更新丢失,需要加锁。要么在应用层加锁,要么在缓存加锁,要么在数据库层使用乐观锁使用version作为更新依据。说明:如果每次访问冲突概率小于20%,推荐使用乐观锁,否则使用悲观锁。乐观锁的重试次数不得小于3次。 那这个重试机制怎么实现呢,本文提供两种实现: 一、自定义注解,用aop解决问题 ...

小葫芦的博客 7261

乐观锁失败或接口调用失败后使用AOP实现重试机制

一、乐观锁失败后会报:ObjectOptimisticLockFailureExceptionjava。二、处理方案:捕获到对应乐观锁失败异常后进行重试。以下使用aop实现一个重试,可用于乐观锁。1、新建一个注解,用于标注需要重试的方法。3、新建切面类对标注注解的方法进行代理。2、新建重试的方法并添加注解。

ClinEvol的博客 975

aop实现乐观锁结合redis

aop实现乐观锁结合redis欢迎使用Markdown编辑器业务处理后置加锁并发业务进入业务完成取消加锁切面实现,删除redis缓存公共util 欢迎使用Markdown编辑器 本项目需要对业务实现乐观锁,防止数据重复操作,结合redis实现。本文为代码实现,无其他说明,学习aop,redis,乐观锁请自行学习。 业务处理后置加锁 ###自定义注解 package com.e6yun.project.tms.revoke.annotation; import com.e6yun.project.tms.r

da297368860的博客 219

springboot乐观锁

包依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <version>1.2.6.RELEASE</version> </dep

qq_34124060的博客 3874

高并发锁事务重试机制(JPA高并发下的乐观锁异常)

乐观锁: model实体类加version字段 @JsonProperty("_version") @Column(name = "version", nullable = false) @Version private Long version = 0L; 问题场景 先在库里查询出该实体,转化为持久态,在这时库里的该数据被修改了...

天才小站 2551

自定义注解——基于AOP实现

先了解几个元注解 分别是@Target, @Retention,@Documented,@Inherited @Target:决定自定义的注解用在什么地方 属性值 作用 ElementType.CONSTRUCTOR 用在构造函数的声明上 ElementType.FIELD 定义在成员变量上 LOCAL_VARIABLE 局部变量的声明 METHOD 定义在方法上面 ...

qq_41700030的博客 3013

Spring AOP 切面利用@Around注解实现幂等性

@Around注解可以用来在调用一个具体方法前和调用后来完成一些具体的任务。 比如我们想在执行controller中方法前打印出请求参数,并在方法执行结束后来打印出响应值,这个时候,我们就可以借助于@Around注解来实现; 再比如我们想在执行方法时动态修改参数值等 类似功能的注解还有@Before等等,用到了Spring AOP切面思想,Spring AOP常用于拦截器、事务、日志、权限验证等方面。 完整演示代码如下: 需要说明的是,在以下例子中,我们即可以只用@Around注解,并设置条件,见

过往很淡的博客 2434

Spring aop实现乐观锁重试

如果有错误的地方,大家可以指正出来: @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface TransactionalWithRetries { int maxTimes() default 3; } @Aspect @Component public class RetryOptLockAop { private final static Logger log = L

Frinday的博客 407

java basdao,WMS项目中使用到的切面

前言目前系统刚启动,骨架刚刚搭建完成,在项目中,使用了一些切面,做一些业务无关的处理。在本文中,将各个切面例举出来,用以加深自己对切面的理解。记得在初学切面的时候,一般文章介绍切面的时候,主要是日志,消息收集等,其实在真实项目中,远不止于此。在现在的项目里面,分别在controller,rpc调用,分页,dao处理,均使用到了切面。下面逐个进行说明。希望本文的阅读者也不吝将项目中使用切面分享出来...

weixin_39522103的博客 170

Spring Boot 乐观锁加锁失败 - 集成AOP

Spring Boot with AOP 手头上的项目使用了Spring Boot, 在高并发的情况下,经常出现乐观锁加锁失败的情况(OptimisticLockingFailureException,同一时间有多个线程在更新同一条数据)。为了减少直接向服务使用者直接返回失败结果的情况,可以使用这种方式解决这个问题: 捕获到OptimisticLockingFailureException...

weixin_33966365的博客 249

mysql乐观锁重试_聊聊数据乐观锁和悲观锁,乐观锁失败后重试

在写入数据库的时候需要有锁,比如同时写入数据库的时候会出现丢数据,那么就需要锁机制。数据锁分为乐观锁和悲观锁,那么它们使用的场景如下:1. 乐观锁适用于写少读多的情景,因为这种乐观锁相当于JAVA的CAS,所以多条数据同时过来的时候,不用等待,可以立即进行返回。2. 悲观锁适用于写多读少的情景,这种情况也相当于JAVA的synchronized,reentrantLock等,大量数据过来的时候,只...

weixin_42212965的博客 733

springboot 乐观锁重试机制

重试机制 针对乐观锁的重试机制我分成以下几个步骤来实现: 自定义注解 给注解添加aop切面,在around中添加业务处理; 给serviceImpl添加注解 自定义注解 @Target({ElementType.METHOD,ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface CustomRetry { //重试次数 ,这里默认15 int value() default

Little_Donkey_的博客 1490
上一篇: 百万级数据EXCEL导出--easyexcel
下一篇: 微信APP支付
JavaMrSun
博客等级 码龄9年 27粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值