锁与事务的关系

2023-10-26

在并发场景下, 我们往往需要在事务方法中加锁来应对并发.如下.下面以 ReentrantLock 为例子.


public final static ReentrantLock MY_LOCK= new ReentrantLock(); 
@Transactional
public Result doWork(String busiId) {
	try {
	    MY_LOCK.lock();
	    // 具体的业务逻辑
	} catch (Exception e) {
	    e.printStackTrace();
	} finally{
	    MY_LOCK.unlock()
	}
	return Result.ok();
}

但是在并发量较大的时候, 会发现出现问题.如秒杀商品场景的话, 会出现超卖的问题.这是因为 ReentrantLock的加/解锁操作是在事务方法内部进行的. 也就是说, 在 unlock()进行后, 事务不一定会提交. 这样就出现问题了.同样, 如果是分布式锁,即便是有网络延迟,但还是不严谨的. 

处理方法: 锁上移. 可以在Controller中对方法加锁.

public final static ReentrantLock MY_LOCK= new ReentrantLock(); 

@RequestMapping("doWork")
@ResponseBody
public String doWork(String busiId){
        Result ret = new Result();
	try{
		MY_LOCK.lock();
        ret = myService.doWork(busiId)
	}finally {
		MY_LOCK.unlock();
	}
	return ret ;
}

还有一种优雅的方式, aop.在aop的切片中,事务的顺序是Ordered.LOWEST_PRECEDENCE.最后执行的.保证了我们定义的加锁aop会在事务切片前执行.

本文参考小柒的文章

----------

https://blog.52itstyle.vip/archives/2952/

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 如有问题, 可邮件(345849402@qq.com)咨询。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

锁与事务的关系 的相关文章

  • 【2021最新版】Java多线程&并发面试题总结(108道题含答案解析)

    文章目录 JAVA并发知识库 1 Java中实现多线程有几种方法 2 继承Thread类 3 实现Runnable接口 4 ExecutorService Callable Future有返回值线程 5 基于线程池的方式 6 4 种线程池
  • C++ std::thread多线程详解

    c 多线程详解 一 std thread线程创建 1 函数指针 2 Lambda函数 3 functor Funciton Object 4 非静态成员函数 5 静态成员函数 二 std thread线程停止 1 join函数 2 deta
  • 并发策略之分工原则

    本文主要思想来自 Java虚拟机并发编程 薛笛 译 为什么要用并发 并发是再在有限的资源下提高性能的有效手段 当然现在互联网环境下并发访问的现象也比比皆是 但是本文并不涉及处理并发访问 而是使用并发手段解决复杂任务的策略 另外关于并发和并行
  • Java并发之锁

    Java并发之锁 一 临界区 二 线程安全 三 解决临界区线程安全问题 四 Java对象头 五 重量级锁 Monitor 5 1 synchronized 5 1 1 synchronized加锁流程 六 轻量级锁 6 1 轻量级锁加锁流程
  • Java并发编程-第二章

    以下内容来自 Java并发编程 书籍第二章 补充 1 volatile的有序性 volatile通过内存屏障实现禁止指令重排序保证有序性 硬件层面的内存屏障分为Load Barrier 和 Store Barrier即读屏障和写屏障 2 同
  • 七、MySql-锁与事物

    MySql 锁与事物 锁 锁的简介 为什么需要锁 锁的概念 MySQL 中的锁 表锁与行锁的使用场景 MyISAM 锁 共享读锁 独占写锁 总结 InnoDB 锁 语法 注意 锁的等待问题 事务 什么存储引擎支持事务 事务特性 原子性 at
  • Transaction rolled back because it has been marked as rollback-only 解决办法

    今天早上高高兴兴上班 居然收到一大堆报警信息 仔细看了一下具体内容 都在提示这个错误 Transaction rolled back because it has been marked as rollback only 我一看就觉得奇怪了
  • 在Windows下使用MingGW[GCC+OpenMP]和CodeBlocks开发多核应用基本环境配置

    转自 http blog csdn net danny xcz article details 3332251 从06年开始 多核开发已经越来越多的成为所有应用设计必须考虑的问题 我使用MingGW CodeBlocks来测试OpenMP多
  • java 关于锁常见面试题

    1 synchronized作用于静态方法和非静态方法的区别 非静态方法 给对象加锁 可以理解为给这个对象的内存上锁 注意 只是这块内存 其他同类对象都会有各自的内存锁 这时候在其他一个以上线程中执行该对象的这个同步方法 注意 是该对象 就
  • mysql的悲观锁和乐观锁

    悲观锁 悲观锁指的是对数据被外界 包括本系统当前的其他事务 以及来自外部系统的事务处理 修改持保守态度 因此 在整个数据处理过程中 将数据处于锁定状态 悲观锁的实现 往往依靠数据库提供的锁机制 也只有数据库层提供的锁机制才能真正保证数据访问
  • Java并发编程实战——并发容器之ConcurrentHashMap(JDK 1.8版本)

    文章目录 ConcurrentHashmap简介 从关键属性及类上来看ConcurrentHashMap的结构 put 方法管中窥豹 CAS关键操作 ConcurrentHashmap简介 在使用HashMap时在多线程情况下扩容会出现CP
  • springboot@Transactional事务不生效的几种解决方案

    springboot事务不生效的几种解决方案 最近在业务中遇到了很奇怪的场景 在加上 Transactional注解后 插入2条数据 如果第二条出异常了 第一条不会回滚 排查了很久 上网也找资料看了很久 问题得以解决 总结了事务不生效的几点
  • 详解ReentrantLock---可重入锁(小白易懂)

    详解ReentrantLock 小白易懂 初识ReentrantLock ReentrantLock是可重入的互斥锁 虽然具有与synchronized相同功能 但是会比synchronized更加灵活 具有更多的方法 ReentrantL
  • SpringBoot事务管理-5个面试核心类源码刨析

    简单的事重复做 你就是专家 重复的事用心做 你就是赢家 在开始讲解SpringBoot事务之前 我们先来整体回顾下事务的概念及特性 便于我们了解SpringBoot是如何解决事务相关问题的 另外这部分也是面试必考内容 需要学习交流的可入群
  • 并发编程系列之原子操作实现原理

    前言 上节我们讲了并发编程中最基本的两个元素的底层实现 同样并发编程中还有一个很重要的元素 就是原子操作 原子本意是不可以再被分割的最小粒子 原子操作就是指不可中断的一个或者一系列操作 那么今天我们就来看看在多处理器环境下Java是如何保证
  • CUDA编程问题记录:能否用CPU多线程调用CUDA核函数

    问题 能否在主机端创建CPU多线程 在每个线程里调用设备端核函数的caller函数 进而实现进一步的并行运行 例如有5张图片 对于每张图片都有N个GPU线程对其进行像素操作 但是此时是逐一对这5张图片处理的 想在主机端创建5个CPU线程 每
  • 深入理解synchronized底层原理,一篇文章就够了!

    文章目录 前言 一 synchronized的特性 1 1 原子性 1 2 可见性 1 3 有序性 1 4 可重入性 二 synchronized的用法 三 synchronized锁的实现 3 1 同步方法 3 2 同步代码块 四 syn
  • MySQL最常用的二种存储引擎MyISAM和InnoDB的介绍

    1 MyISAM 默认表类型 它是基于传统的ISAM类型 ISAM是Indexed Sequential Access Method 有索引的顺序访问方法 的缩写 它是存储记录和文件的标准方法 不是事务安全的 而且不支持外键 如果执行大量的
  • 并发编程4 - 线程状态、死锁及ReentrantLock

    文章目录 一 再述线程状态转换 二 多把锁与线程活跃性问题 1 多把锁 2 活跃性 三 ReEntrantLock 1 基本用法 2 可重入 3 可打断 4 锁超时 5 公平锁 6 条件变量 一 再述线程状态转换 情况1 New RUNNA
  • Java并发编程之设计模式

    同步模式之保护性暂停 1 定义 即 Guarded Suspension 用在一个线程等待另一个线程的执行结果 要点 有一个结果需要从一个线程传递到另一个线程 让他们关联同一个 GuardedObject 如果有结果不断从一个线程到另一个线

随机推荐

  • Flutter GetX 状态管理,路由管理,智能依赖注入

    直接上网址 GetX 关于GetX GetX 是 Flutter 上的一个轻量且强大的解决方案 高性能的状态管理 智能的依赖注入和便捷的路由管理 GetX 有3个基本原则 性能 GetX 专注于性能和最小资源消耗 GetX 打包后的apk占
  • java 工具篇(MySQL数据库工具) 数据库实体创建

    第一步 生成工具源代码 package com mysql util import java io File import java io FileWriter import java io IOException import java
  • Linux内核开发三:多进程编程

    1 什么是进程 我们可以通俗地把进程看作是正在运行着的二进制程序 占用内存空间消耗系统资源 例如使用 vim 命令编辑文件内容就会生成一个进程 进程是 OS 资源分配的基本单位 每个进程在操作系统中都执行着特定的任务 如网络服务 etc i
  • shell拷贝mongodb数据库

    拷贝mongodb数据库 mongodump h 服务器IP port 端口 u 用户名 p 密码 d 数据库 o 导出路径 h MongoDB 所在服务器地址 例如 127 0 0 1 当然也可以指定端口号 127 0 0 1 27017
  • VS2019 无法登录 许可证已过期 无法下载许可证

    许可证已过期 点击检查更新的许可证 报出错误 我们无法下载许可证 请检查你的网络连接或代理设置 解决方法 其实问题就在于嵌入式web浏览器的问题 选择账户选项 账户 登录选项 将嵌入式web浏览器改为系统web浏览器 随后就能登录了
  • Android底层驱动开发记录:01_JNI

    最近项目中需要用到了Android底层的开发 正好疫情居家所以又把韦老师的老教程第四期Android教程翻出来学习学习 手边也没有合适的板子 找了一块AIO 3288C的板子接了一块HDMI的屏来用 本来之前一直做单片机的 因此学起来还比较
  • 宝塔漏洞复现

    声明 好好学习 天天向上 漏洞描述 宝塔面板是一款服务器管理软件 支持windows和linux系统 可以通过Web端轻松管理服务器 提升运维效率 例如 创建管理网站 FTP 数据库 拥有可视化文件管理器 可视化软件管理器 可视化CPU 内
  • QT中的信号和槽函数

    一 信号和槽机制 1 概念 信号和槽是Qt中自行定义的一种通信机制 实现对象之间的交互 当某个对象发生改变时将会发送信号 该信号可以被其它对象接收 接收以后将执行一个指定的成员函数 槽函数 图解 2 定义 1 包含信号或槽的类必须是QObj
  • GET请求与POST请求的区别

    1 安全性 GET请求通过拼接url传递参数 会在url地址栏显示 相对不安全 POST请求通过body体传递参数 不会在url地址栏中显示 相对安全 2 传输数据大小 GET请求对传输的数据大小有限制 最多2K POST请求对传输的数据大
  • 练手小项目:51单片机控制的智能台灯设计(自动感应调光) 电路图,测试图,源代码全技术资料

    功能及概述 本系统组成如图一所示 主要由三部分组成 传感器及信号处理部分 检测人体辐射红外信号及光强信号经过处理后变成可处理的数字信号 以80C51组成的中央处理单元 处理信号并发出控制命令 提醒电路及灯光控制电路 给出提醒信号并根据80C
  • vue3基础 ---- 上

    目录 一 vue3介绍 1 官网初识 2 环境搭建 2 1 线上尝试 2 2 CDN使用 2 3 Vue CLI 2 4 Vite 二 vue3基础 1 模板语法 1 1 我的第一个vue应用 1 2 应用背后的真相 1 3 模板语法 新的
  • API 治理的目标是什么?

    建立有效的API治理需要正确理解其目标 但它究竟是什么呢 是定义标准或规则并应用它们吗 都不是 虽然这些是治理的一个重要手段 但这并非其最终目的 为了揭示API治理的真正目标 让我们探讨一下在适当地制定标准后能得到什么 1 从 API 混乱
  • Jetty服务器好处

    Jetty可以同时处理大量连接而且可以长时间保持连接 适合于web聊天应用等等 Jetty的架构简单 因此作为服务器 Jetty可以按需加载组件 减少不需要的组件 减少了服务器内存开销 从而提高服务器性能 Jetty默认采用NIO结束在处理
  • python中sys是什么意思_python里的sys是什么意思

    sys模块功能多 我们这里介绍一些比较实用的功能 相信你会喜欢的 和我一起走进python的模块吧 sys模块的常见函数列表 sys argv 实现从程序外部向程序传递参数 sys exit arg 程序中间的退出 arg 0为正常退出 s
  • ubuntu配置mysql网络连接_在Ubuntu14.04中配置mysql远程连接教程

    上一篇文章 小编带大家学会了在Ubuntu14 04中安装MySQL 没有来得及上课的小伙伴们可以戳这篇文章 如何在Ubuntu14 04中安装mysql 今天给大家分享一下 如何简单的配置MySQL 可以实现远程连接 具体的教程如下 1
  • 代码雨类库的实现

    代码雨类库的实现 电影黑客帝国有个代码雨效果 挺酷的 我在网上看到了使用js写的代码雨的代码 我把由函数实现的代码 改为使用类实现代码雨特效 一 设计一个简单美化的网页且包含该有的功能 功能 1 一块画布 实现代码雨的展示 2 初始化按钮
  • 字节跳动第五届青训营后端练习题——分割ip(Java版)

    题目 有效 IP 地址正好由四个整数 每个整数位于 0 到 255 之间组成 且不能含有前导 0 整数之间用 分隔 例如 0 1 2 201 和 192 168 1 1 是有效 IP 地址 但是 0 011 255 245 192 168
  • nginx 反向代理常用配置

    全部代理 location 设置跨域 add header Access Control Allow Origin add header Access Control Allow Methods GET POST OPTIONS add h
  • TS2559: Type ‘{ children: string; }‘ has no properties in common with type ‘IntrinsicAttributes & Fi

    Type children string key string is not assignable to type IntrinsicAttributes FilterTagPropsType Property children does
  • 锁与事务的关系

    在并发场景下 我们往往需要在事务方法中加锁来应对并发 如下 下面以 ReentrantLock 为例子 public final static ReentrantLock MY LOCK new ReentrantLock Transact