当前位置: 首页 > news >正文

工作中遇到的事务

文章目录

    • 介绍
    • 原因分析:
    • 修改代码
    • 一波三折,再次出现问题

介绍

遇到了一个很有意思的问题。
在service层加了事务。
为了防止并发,在component层加了分布式锁。

  1. 先根据前端传入的id,在数据库中使用queryA()查到一个key
  2. 然后对这个key进行加锁
  3. 再次调用queryA()。目的是为了做校验
  4. 更新数据库
  5. 在component层释放锁

最终现象是:加锁失败。

线程A获取到了锁,然后执行下面的操作。
线程B等待这把锁。
线程A执行完了之后,释放锁。
线程B查数据库,依然校验成功。按理说A操作了数据,线程B的校验应该不通过。
实际上线程B没有读到线程A更新后的数据

原因分析:

数据库mysql的隔离级别是 可重复读。

那么在线程B等待锁的时候,已经缓存了一份数据库连接了。
此时A更新了数据,然后释放锁(假设提交了事务),由于是可重复读级别的事务隔离,所以线程B此时无论如何都读不出来线程A修改的数据。
后来解决方法就是让前端传key进来。

修改代码

也就是代码改成了

1. 前端传入key
2. 然后对这个key进行加锁
3. 调用数据库的queryA()方法。目的是为了做校验
4. 更新数据库
5. 在component层释放锁

此时线程A获取到了锁,直到事务提交了,线程B才开始数据库连接,此时正常

一波三折,再次出现问题

经过上面的分析,
现在我也怀疑,是不是在事务提交前就释放了锁呢?

http://www.lryc.cn/news/173679.html

相关文章:

  • 【论文写作】Latex 所有符号汇总参考
  • pom.xml中解决“vulnerable dependency maven:org.yaml:snakeyaml:1.33“警告问题
  • 栈和队列-Java
  • ORA-07445: exception encountered: core dump [kdxlin()+4088]---惜分飞
  • 【C刷题】day3
  • go 线程限制数量 --chatGPT
  • 【Linux网络编程】日志与守护进程
  • 多输入多输出 | MATLAB实现CNN-BiGRU卷积双向门控循环单元多输入多输出
  • Qt: 鼠标形状设置
  • 【Oracle】Oracle系列之七--表的创建与管理
  • C/C++运算符超详细讲解(系统性学习day5)
  • Android 遍历界面所有的View
  • 建筑能源管理(1)——建筑能源管理的概念
  • SpringSecurity
  • C++ vector模拟实现
  • BUUCTF:[GYCTF2020]FlaskApp
  • 好玩的调度技术
  • Android 自定义加解密播放音视频(m3u8独立加密)
  • 常见的文件格式
  • 浏览器输入url后回车展开过程
  • Docker 容器创建命令说明
  • 西瓜书读书笔记整理(六)—— 第六章 支持向量机
  • 蓝桥杯每日一题2023.9.23
  • C语言数组和指针笔试题(三)(一定要看)
  • leetcode11 盛水最多的容器
  • 进入数据结构的世界
  • stm32之看门狗
  • 纤维蛋白单体(FM)介绍
  • 知识图谱实战导论:从什么是KG到LLM与KG/DB的结合实战
  • 第5章 会话与会话技术