码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 工作中遇到的事务


    文章目录

      • 介绍
      • 原因分析:
      • 修改代码
      • 一波三折,再次出现问题
      • 总结: 在加锁后,添加事务。不要先添加事务然后加锁。

    介绍

    遇到了一个很有意思的问题。
    首先是在service层加了事务。
    在component层中的代码如下:

    先根据前端传入的id,在数据库中使用queryA()查到一个key
    try{
     	然后对这个key进行加锁(失效时间10s,等待时间100s)
    	再次调用queryA()。目的是为了做校验
    	更新数据库
    } finally{
    	释放锁
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    最终现象是:防止并发失败

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

    原因分析:

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

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

    修改代码

    也就是component代码改成了

    前端传入key;
    try{
    	然后对这个key进行加锁
    	调用数据库的queryA()方法。目的是为了做校验
    	更新数据库
    } finally {
    	释放锁
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

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

    一波三折,再次出现问题

    经过上面的分析,
    问题出在了在事务提交前就释放了锁。
    所以应该在加锁后,添加事务。不要先事务后锁。

    总结: 在加锁后,添加事务。不要先添加事务然后加锁。

  • 相关阅读:
    【解密ChatGPT】:从过去到未来,揭示其发展与变革
    算法学习笔记2023.1
    identity4 系列————开篇概念[一]
    计算机组成原理-----定点数原码和补码的乘法与除法
    如何确定推荐计划是否会成功?有这几个重要指标
    考研数学一二三 2010-2019年每道题的难度系数
    Shiro-01-简单实例
    【Spring】从面向对象再到面向切面
    ElasticSearch性能原理拆解
    [附源码]计算机毕业设计springboot电影院网上售票系统
  • 原文地址:https://blog.csdn.net/qq_43179428/article/details/132919995
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号