项目场景:

例如:一个user表,里面有个字段名称是account_money(账户金额)。
现在的操作是,先查询这个表中账户余额多少,再加上前端传来的金额,最后更新到表中。


问题描述

Redis分布式锁失效

加锁{查表取值更新
}
释放锁

原因分析:

高并发情况下,数据库事务未提交,但是分布式锁已经释放,导致第二次查询到的数据还是未更新前的数据。

以线程A和B为例:

  1. 线程A得到锁,
  2. 线程A查看user表得到账户余额,,
  3. 线程A加上前端传来的余额,
  4. 线程A更新数据库。
    • 开启事务
    • 执行更新语句(注意此时程序顺序执行释放锁,线程B获取锁
      • 线程B获取锁,
      • 查询user表获得未更新前的账户余额,
    • 提交事务
  5. 线程B加上前端传来的余额,
  6. 线程B更新数据库。

总结:锁没起到我们想要的效果导致“失效”。


解决方案:

  1. 手动提交事务。既然是由事务提交慢了导致的,我们可以手动提交事务。
    可供参考:https://www.jianshu.com/p/f39ae0c34a85
  2. 分布式锁中重逻辑。在不手动提交事务的情况下,为避免脏读,我们可以让分布式锁中的逻辑变重。试想一下,在线程B获取锁之后,并不立即执行查user表的操作,而是先进行参数校验,或者查询其它表,这就给了线程A事务提交的缓冲时间,从而避免了脏读。
  3. 组内一个大佬说spring事务的嵌套提交方式也可以避免这种情况的发生。
    具体实现是,将查表更新表的操作单独封装成一个方法(在事务外面加锁)。然后加上spring事务(嵌套提交)。
@Transactional(propagation = Propagation.NESTED)

可供参考:
Spring事务的七种传播方式:https://blog.csdn.net/t_t2_3/article/details/114548914
Redis分布式锁三种失效场景分析:https://blog.csdn.net/ZDK_csdn/article/details/122487945

事务未提交而释放锁导致的Redis锁失效分析相关推荐

  1. mysql vip切换未重连问题_服务器断网事务未提交导致MYSQL锁表问题(ADSL拨号上网)...

    环境描述: 由于特殊原因服务器的网络是电信ADSL拨号上网的,用"自动切换IP精灵"进行自动断网重连,每次重新连上网络需要2s时间,设置2小时切换一次网络. MYSQL数据库在远程 ...

  2. 解决MySQL事务未提交导致死锁报错 避免死锁的方法

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/xuheng8600/article/d ...

  3. mysql事务未提交读_mysql事务之未提交读Read uncommitted(仅学习)

    1,Read uncommitted定义: wiki上的定义如下: 未提交读(READ UNCOMMITTED)是最低的隔离级别.允许脏读(dirty reads),事务可以看到其他事务"尚 ...

  4. 数据库事务未提交的初学理解

    初学数据库,对事务未提交的个人见解(个人学习记录) 本人大二.通过计算机组成的学习,同时最近对mysql事务的疑惑 事务提交前,涉及修改表操作的DML语句执行后,所造成的结果到底有没有写入永久性磁盘, ...

  5. 频繁分配释放内存导致的性能问题的分析--brk和mmap的实现

    现象 1 压力测试过程中,发现被测对象性能不够理想,具体表现为:  进程的系统态CPU消耗20,用户态CPU消耗10,系统idle大约70  2 用ps -o majflt,minflt -C pr ...

  6. mysql——如何解决事务未提交导致锁等待

    背景 有一次同事使用 Navicat for MySQL 软件对某个表进行了 开启事物,导致我们一直查询不出数据. 这种情况在平时项目也会出现 事物未提交的情况. 那么问题来了,事物未提交导致锁等待如 ...

  7. 多次请求事务未提交导致的数据重复入库问题

    起因 最近的一次开发中,请求过来要判断数据是否存在,不存在则入库.由于是循环有着相同的数据入库请求,在执行时上一次事务还未提交,第二次的请求在数据库查询判断时发现数据不存在,又执行了一次入库请求,导致 ...

  8. mysql事务未提交 也未回滚

    文章目录 一.场景模拟 二.紧急处理 三.原因分析 四.相关命令 1.查看正在执行的事务 2.查看正在锁的事务 3.查看等待锁的事务 4.查看所有的线程列表 5.定位未提交的事务执行的sql语句 公司 ...

  9. 事务未提交 别人能读取到吗_Mysql 事务-面试笔记

    问题汇总: 什么是事务 事务的特征-ACID 事务的原理 事务隔离级别 并发事务带来的问题 - 数据库隔离现象 不可重复读与幻读的区别 事务隔离机制解决方法 什么是MVCC MVCC是如何工作的 MV ...

最新文章

  1. Core Linux折腾(二)
  2. 万用表检测常用元器件的方法
  3. LazyInitializationException的四种解决方案–第2部分
  4. 程序员想进大公司?学会这门编程知识,决定你能进什么样的企业!
  5. 美国百亿亿次超算要比中国晚两三年,但真实性能更恐怖
  6. oracle增加文件组,Oracle 文件和文件组
  7. python如何读取txt数据库_详解Python如何读取MySQL数据库表数据
  8. 设计配色灵感|热情甜蜜色系配色方案
  9. Oracle数据备份与恢复
  10. Java字符串拼接的优雅方式
  11. python批量识别二维码图片_python+selenium 识别二维码
  12. mac使用vscode
  13. 万事开头难 实践出真知
  14. ACID特性的实现原理与MySQL事务的关系
  15. 腾达n304v2支持万能中继吗_腾达无线路由器,无线中继怎么设置?
  16. 期货如何展期(期货合约展期)
  17. [FFmpeg] 去除 logo
  18. 使用FME封装一个多线程爬取m3u8在线视频的小玩意
  19. java 内存模型面试_Java面试- JVM 内存模型讲解
  20. 妹子面试阿里,面试官竟问她有没有男朋友?面试真题「PDF分享

热门文章

  1. 没有找不到的学术资源,请生信人低调使用!
  2. 3d智慧城市线上3d建模仿真三维模型展示
  3. Win10激活KMS
  4. 地下城与勇士(DNF)陌路者要塞副本(热血八番街、绿都格罗兹尼 )(童年的回忆)
  5. vue脚手架安装以及vue脚手架创建项目(详细步骤)
  6. DotA Allstars所有命令大全
  7. OPPO R11 R11系列获取root权限,应该也包括密码破解(自行尝试),本人请测root 可以。
  8. VMware 新建虚拟机
  9. JZOJ6893. 【2020.11.25提高组模拟】小 T 与灵石(stone)题解
  10. 我也是LeetCode周赛“三道题选手”啦 第270场周赛