今日代码 PK | 处理 Spring 事务和锁冲突

在我们日常的开发中,经常会接触到事务和锁,

当同时用到这二者的时候,你知道里面的坑吗?

比如,某个service里的下面这段伪代码有问题吗?

示例代码:

@Transactional(rollbackFor = Exception.class)
public Boolean test() {
    String lock = "id";
    synchronized (lock.intern()) {
        // 业务代码
    }
    // 剩余逻辑

    return true;
}

很显然是有问题,因为MySQL的默认隔离级别是可重复读,

因此在该事务提交前其他事务并不能获取到该事务对数据操作后的结果,

那么在第一个事务的synchronized块执行完之后且事务提交之前,

其他事务在执行synchronized块中的代码时使用的仍然是老数据,

从这方面来说其实就相当于没有锁住,也就是锁失效。

那么怎么改呢?示例代码如下:

public Boolean test() {
    String lock = "id";

    PostService postService = (PostService) AopContext.currentProxy();
    synchronized (lock.intern()) {

        return postService.innerTest();
    }

    return true;
}

@Transactional(rollbackFor = Exception.class)
public Boolean innerTest() {
    // 业务逻辑

    return true;
}

上面的代码中我们没有直接调用innerTest方法而是通过AopContext获取的对象调用,

你知道为什么吗?欢迎投票并在评论区讨论。

完整代码片段来源于代码小抄,欢迎点击进入小程序阅读!

在线访问:https://www.codecopy.cn/post/gzshnr

更多优质代码欢迎进入小程序查看!

往期推荐

今日代码 PK | 使用 try-with-resources 关闭资源

今日代码 PK | 避免循环查库

今日代码 PK | 使用 Optional 判空

今日代码 PK | Java 使用正则表达式

今日代码 PK | 优雅统计耗时

相关推荐

  • Redis 有几种缓存读写策略?
  • 几个有点冷门的 vscode 插件,但绝对好用!
  • 3D版Sora来了?UMass、MIT等提出3D世界模型,具身智能机器人实现新里程碑
  • GPT-4「荣升」AI顶会同行评审专家?斯坦福最新研究:ICLR/NeurIPS等竟有16.9%评审是ChatGPT生成
  • 女子早癌病变被漏诊,AI医生在X光中发现!谷歌最新AI听咳嗽就能检测新冠/结核
  • 今日arXiv最热NLP大模型论文:COLING2024发布数据集揭示从莎士比亚时期开始的性别偏见
  • 升级!Sora漫步街头的女人可以跳舞啦!科目三蹦迪多种舞姿停不下来,可精准控制动作
  • GTC 2024 回顾:揭示大模型领域的国内外前沿研究与应用
  • 一文告诉你如何用 Python 操作 ChatGPT
  • 大数据 AI 一体化解读
  • Spring 6 正式“抛弃” feign
  • 10个能用AI来提升收入的方法
  • 董宇辉与戴建业教授同游东湖,“你小子”火了!
  • 工作中最常见的 6 种 OOM 问题
  • 分库分表实战
  • Spring Boot集成zxing实现生成二维码功能
  • Java日志系统历史从入门到崩溃
  • 几种常见的 Kafka 集群监控工具
  • 持续移动开发如何从测试自动化中获益
  • 大模型企业怎么“卷”过 | 直播预告