首页 > 数据库 >java进行数据库操作的并发控制的2种方法

java进行数据库操作的并发控制的2种方法

时间:2023-12-28 10:22:45浏览次数:29  
标签:java 数据库 update 并发 线程 save

本文分享自华为云社区《java进行数据库操作的并发控制》,作者:张俭。

在现代应用编码中,从数据库里面find出来,进行一些业务逻辑操作,最后再save回去。即:

Person person = personRepo.findById(id);
person.setAge(18);
personRepo.save(person);

但是这样的业务操作,如果一个线程修改年龄,另一个线程修改昵称,最后save回去,可能会导致年龄/昵称某一个的修改被覆盖。

常见的解决方案有两种

执行前添加悲观锁

通过分布式锁等方式,保证同一时间只有一个线程能够对数据进行修改。

乐观锁思路实现

版本控制是另一种流行的处理并发问题的方法。它通过在每次更新记录时递增版本号来确保数据的一致性。

这在JPA中,可以通过在field上添加@Version注解来实现,但这也就要求①数据库中必须有version字段,②对于查找后更新类操作,必须使用JPA的save方法来进行更新。

当然也可以通过update_time来模拟乐观锁实现,这可能需要你在更新的时候添加update_time的条件,并且,update_time在极端场景下,理论正确性没那么严谨。

点击关注,第一时间了解华为云新鲜技术~

 

标签:java,数据库,update,并发,线程,save
From: https://www.cnblogs.com/huaweiyun/p/17932135.html

相关文章

  • DBeaver 连接 GBase 数据库
    DBeaver连接GBase数据库DBeaver连接GBase数据库说明这是我重新走一次流程记录的,所以图片中会有添加好的驱动包。我用的是适配MySQL和PostgreSQL的那个jar包,不过操作都是一样的,虽说jar包不一样,但DBeaver可以帮你找到驱动类,这点比较方便。还有其实可以通过......
  • java8 新特性(二)CompletableFuture类
    CompletableFuture是Java8中引入的一个新特性,它表示异步计算的结果。通过使用CompletableFuture,可以方便地处理异步计算,并能够在计算完成后执行回调函数。CompletableFuture是Java8中引入的一个功能强大的类,它实现了Future接口,并在此基础上进行了丰富的扩展,以简化异步编程的复......
  • 无涯教程-Java泛型 - 有界类型
    有时您可能想限制参数的类型,如对数字进行操作的方法可能只希望接受Number或其子类的,这就是有界类型参数的用途,使用extends实现。这个示例是泛型方法,返回三个Comparable对象中的最大对象-publicclassMaximumTest{//确定三个Comparable对象中最大的一个publics......
  • Java定义变量容易出错的点
    在Java中,定义的数值有默认的类型(整型为int、浮点型为double),所以在定义变量的时候要注意类型的问题。例如:因为给l的值(10000000000)默认类型是int类型,所以超出了范围;修改:在给的值后面加上L,......
  • 数据库专题--XQuery语句
    XQuery相对于XML的关系,等同于SQL相对于数据库表的关系。XQuery被设计用来查询XML数据-不仅仅限于XML文件,还包括任何可以XML形态呈现的数据,包括数据库。XQuery是用来从XML文档查找和提取元素及属性的语言。这是一个XQuery解决实际问题的例子:“从存储在名为......
  • Java基础2
    1.抽象类在Java中,抽象类(AbstractClass)是一种特殊类型的类,它不能被实例化,而是用于被其他类继承。抽象类可以包含抽象方法和具体方法。以下是关于抽象类的一些关键点:定义抽象类:使用abstract关键字定义抽象类。不能实例化抽象类,即不能使用new关键字创建抽象类的......
  • 无涯教程-Java泛型 - 原始类型
    如果原始类型的类型参数在创建过程中未传递,则原始类型是通用类或接口的对象。以下示例将展示上述概念。packagecom.learnfk;publicclassGenericsTester{publicstaticvoidmain(String[]args){Box<Integer>box=newBox<Integer>();box.set......
  • 运行Java程序
    Java及环境变量:安装openjdk-8-jre-headlessls/usr/bin/java默认放在/usr/bin下,不需要额外设置PATH 提示:如果放在自定义位置,需要设置PATHexport PATH=$PATH:/opt/jdk8/bin运行Java程序:1.在Windows上开发和调试2.发布......
  • Java登陆第三十天——Cookie和Session
    会话会话就是客户端与服务器的一次交互。HTTP是一种无状态协议无状态:服务端不会记录客户端信息。有的时候,我们需要保存客户端的信息。对于登陆功能来说,保存客户端信息,可以避免客户端每访问都需要登陆一次至此,会话管理诞生。CookieCookie是一种客户端会话技术,并保存在......
  • JavaImprove--Lesson02--Object类,Objects工具类,封装类
    一.Object类Java中的Object类是所有类的超类,它是Java类层次结构的根类。这意味着所有的类都直接或间接地继承自Object类equals(Objectobj):用于比较两个对象是否相等。默认实现是比较对象的引用,但可以通过重写此方法来比较对象的内部状态。hashCode():返回对象的哈希码值,通......