Java正常加锁但是没有起作用的问题(纪实)

概述

  Redisson分布式锁,加锁代码完全正确,但是却没有起到锁的作用。

  首先说明一下,这里的加锁代码是正确的,不存在因为加锁错误,锁失效的问题。那么锁是正常有效的,为什么没有起到锁的作用呢。下面先说一下我的业务场景:

  这里的问题存在于支付场景,用户支付完成之后,为了确保安全快速的修改用户的订单数据,一个是第三方支付公司的回调,另外一个方面就是通过定时任务主动的轮询进行订单的查询。两条线同时确保数据能够安全快速的获取到用户的支付数据,这个时候就需要使用到锁了,那么这个锁是用在什么地方?

  两条线确保数据快速安全的,但是修改数据的只能是一条线,否则容易导致重复修改操作订单数据,导致订单数据的错误,所以这个时候要上锁,当任意一条线先修改订单之前,要上锁锁住订单,那么其他线暂时获取不到锁,锁里面先查询订单是否处于支付中的状态,如果是那么修改为支付成功,之后释放锁;这个时候另外一条线就可以获取到锁了,进去判断支付状太已经是支付成功直接退出。

问题描述

  运行过程中,总是出现因为重复修改数据导致的错误,添加日志发现,每次进去锁之后查询出来的数据都是支付中的状态(即使确定前一条线已经修改为支付成功,但是这条线依旧查到支付中),然后两条线的执行时间间隔很短,但是能够确定的是锁是没有问题的,锁的执行确定是在上一个订单锁释放之后才执行的。那么原因到底是什么呢?

问题的解决

  问题的解决是经过几天时间的监测以及猜测才找到,猜测过程后面说,这里先说明一下我这里遇到的情况。

  • 首先便是事物导致的。 在定时任务中执行任务的流程比较多,所以添加了事物,而且是定时任务上的事物。因为定时任务是查询一堆支付中的订单,然后循环每一个订单进行查询(在每个订单上分别加锁),如果事物存在,也就是需要所有的订单都循环完毕才能将所有的数据一起提交完成,所以在整个循环完毕之前很多订单的锁已经被释放了,但是数据未被提交,回调任务获取到的是未被提交的数据,这个时候就导致了重复修改数据。修改方案就是将单个订单进行事物操作便可。
  • 之后便是缓冲导致的。 项目中使用了mybatis进行数据库的连接查询,我们都应该知道mybatis是存在一级缓冲和二级缓冲的,默认情况下一级缓冲是开启的,也就是说当你一个线程查询数据之后再次以同样的方式进行查询的时候,是直接从一级缓冲中提取数据的。正好在回调方法中上锁之前进行了一次订单查询,上锁之后又用同样的条件进行了数据的查询,导致了数据获取到的是缓冲中的数据,而不是数据库中已经被修改的数据。修改的方案很简单,通过添加不同的查询条件,这样就不会直接从缓冲中进行数据的获取了。

这两种情况都是比较碰巧的情况下才会出现,尤其是缓冲这个。但是当订单量足够大的时候就不是碰巧了,而是必然会出现的错误。

猜测过程

  在解决问题的过程中除了上面两种原因还有过了一个关于错误原因的猜测,但是目前无法进行测试证明,仅仅是一个猜测。

  首先便是redisson分布式锁是一种可重入锁,也就说一个如果是一个线程,可以重复进入这个锁。所以个人猜测有没有可能执行定时任务和回调方法的是同一个线程。因为定时任务和回调方法都是从线程池中获取线程的,虽然说线程被激活获取后,不在闲置队列,无法被再次获取,但是有没有可能县城在执行过程中停个几毫秒(类似sleep),从而被其他方法获取执行,导致执行两个方法的是同一个线程。

  这个只是个人的一种猜测,请了解的兄弟指点。

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

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

相关文章

等保测评--安全管理中心--测评方法

安全子类--系统管理 a) 应对系统管理员进行身份鉴别,只允许其通过特定的命令或操作界面进行系统管理操作,并对这些操作进行审计; 一、测评对象 提供集中系统管理功能的系统; 二、测评实施 1)应核查是否对系统管理员进行身份鉴别; 2)应核查是否仅允许系统管理员通过…

基于多设计模式下的同步异步日志系统

基于多设计模式下的同步&异步日志系统 代码链接:https://github.com/Janonez/Log_System 1. 项目介绍 本项目主要实现一个日志系统, 其主要支持以下功能: 支持多级别日志消息支持同步日志和异步日志支持可靠写入日志到标准输出、文件…

【Three.js】第二十一章 Physics 物理

介绍 物理是WebGL可以添加到项目体验中最酷的功能之一。人们喜欢真实物理感的物体,看到它们碰撞、倒塌、坠落和弹跳,就像我的作品集一样: https: //bruno-simon.com/ 有很多方法可以将物理功能添加到您的项目中,这取决于您想要实…

Python标准库sys

sys 模块主要负责与 Python 解释器进行交互,该模块提供了一系列用于控制 Python 运行环境的函数和变量。 函数和对象清单 对象名称 对象说明 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.path 返回模块的搜索路径,初始化时…

如何使用 Python 多处理模块

在本文[1]中,我们将学习如何使用多处理模块中的特定 Python 类(进程类)。我将通过示例为您提供快速概述。 什么是多处理模块? 还有什么比从官方文档中提取模块更好的方式来描述模块呢? Multiprocessing 是一个使用类似…

区块链技术研究探讨

介绍 区块链技术是一种去中心化的分布式账本技术,它通过将数据存储在多个参与者之间的区块链网络中,确保数据的透明性、安全性和不可篡改性。以下是关于区块链技术的一些重要信息: 1、 工作原理:区块链是由一系列按时间顺序链接…

21.4 CSS 盒子模型

1. 边框样式 border-style属性: 指定元素的边框样式.常用属性值: - none: 无边框(默认值). - solid: 实线边框. - dotted: 点状边框. - dashed: 虚线边框. - double: 双线边框. - groove: 凹槽状边框. - ridge: 脊状边框. - inset: 内阴影边框. - outset: 外阴影边框.这些值可…

python内置类属性

class Person:"""这是一个类,功能是描述一个人的精神面貌与行为"""age 19def __init__(self, name):self.name namedef run(self):print("run")"""__dict__ : 类属性__bases__ : 类所有父类构成元组__doc…

使用SimPowerSystems并网光伏阵列研究(Simulink实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

随机流-RandomAccessFile

RandomAccessFile RandomAccessFile 基本操作案例 RandomAccessFile 基本操作 案例 import java.io.*;public class TestMain09 {public static void main(String[] args) throws Exception {insert("D:\\home\\product\\aa.txt",2,"ni");}public static…

C++:类和对象(二)

本文主要介绍:构造函数、析构函数、拷贝构造函数、赋值运算符重载、const成员函数、取地址及const取地址操作符重载。 目录 一、类的六个默认成员函数 二、构造函数 1.概念 2.特性 三、析构函数 1.概念 2.特性 四、拷贝构造函数 1.概念 2.特征 五、赋值…

TS编译选项

自动监控编译 tsc xxx.ts -w 在一个文件夹下,创建 tsconfig.json 文件,在用命令 tsc 就可以自动编译当前文件夹下的ts文件 tsconfig.json文件配置如下: {/*tsconfig.json 是ts编译器的配置文件,ts编译器可以根据它的信息来对代…

Jenkins+maven+testng+htmlreport单元自动化测试

背景说明 为了可以在jenkins自动化运行单元测试的代码,所以使用maventestng的技术结合,达到手动或者定时去执行单元测试的代码,以便提高人工运行的自动化的效率。单元通过该方案也可以套用在httpclient框架去执行测试web api接口的自动化测试…

Kubernetes 工作中常见命令总结

① configmap 文件的操作命令:命名空间为platform,configmap的名称为openapi kubectl -n platform describe configmap openapi kubectl -n platform get configmap openapi -o yaml kubectl -n platform edit configmap openapi kubectl -n platform…

撰寫自己的Python C擴展!

撰寫自己的Python C擴展! 前言spam.cheaderC函數參數參數解析函數主體生成回傳值 method table模組定義模組初始化函數拋出異常main函數完整代碼 編譯及鏈接使用gcc使用gcc Python flags使用distutils 從Python調用C函數直接import使用distutils透過ctypes調用so檔 前言 本篇…

2022年09月 C/C++(五级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 第1题:城堡问题 1 2 3 4 5 6 7 ############################# 1 # | # | # | | # #####—#####—#—#####—# 2 # # | # # # # # #—#####—#####—#####—# 3 # | | # # # # # #—#########—#####—#—# 4 # # | | | | # # ###########…

2023高教社杯数学建模E题思路模型 - 黄河水沙监测数据分析

# 1 赛题 E 题 黄河水沙监测数据分析 黄河是中华民族的母亲河。研究黄河水沙通量的变化规律对沿黄流域的环境治理、气候变 化和人民生活的影响, 以及对优化黄河流域水资源分配、协调人地关系、调水调沙、防洪减灾 等方面都具有重要的理论指导意义。 附件 1 给出了位…

Opencv图像暗通道调优

基于雾天退化模型的去雾算法,Opencv图像暗通道调优,(清华版代码)对普通相片也有较好的调优效果,相片更通透。 结合代码实际运行效果、算法理论模型、实际代码。我个人理解,实际效果是对图像的三个颜色通道…

04架构管理之分支管理实践-一种git分支管理最佳实践

专栏说明:针对于企业的架构管理岗位,分享架构管理岗位的职责,工作内容,指导架构师如何完成架构管理工作,完成架构师到架构管理者的转变。计划以10篇博客阐述清楚架构管理工作,专栏名称:架构管理…

PDF转Word的方法分享与注意事项。

PDF和Word是两种常用的文档格式,它们各有优点,适用于不同的场景。然而,有时候我们需要将PDF转换为Word,以便更好地进行编辑和排版。本文将介绍几种常用的PDF转Word的方法,并分享一些注意事项。 一、PDF转Word的方法 使…