当前位置: 首页 > 知识库问答 >
问题:

Hibernate中的并发事务

吴峰
2023-03-14

我有相同的模块,连接数据库运行在两个服务器(后台和前台)。它与同一个数据库连接。

我使用JPA(Hibernate实现)和Spring事务管理。

我有以下问题:

我必须用两个不同字段的最大值1更新表a中的字段a(表a中的字段a,表b中的字段b)

案例1:

更新前

表A fA = 100

tableB fB=102

更新后

表a fA=103

tableB fB=102

案例2:

更新前

表A fA = 102

表B fB = 100

更新后

表a fA=103

表B fB = 100

这段代码的方法是事务性的,在此之前(比如创建实体)和之后都要做一些事情。因此,在提交事务之前,如果另一个应用程序试图获取该值,它将会过期,并将相同的值保存在fieldA中。Hibernate会话是不同的,因为分布式系统。

我不能在数据库中使用序列(法律问题,因为它是关于发票的)或Hibernate的分布式缓存(系统问题)

我该怎么做??

谢啦

共有3个答案

微生旻
2023-03-14

我不知道我是否正确理解了你的问题,但是也许在你的道中,你可以准备一个方法,在那里你可以这样做

DetachedCriteria dc = DetachedCriteria.forClass(ClassA);
dc.setProjection(Projections.max("id"));
logger.info(svc.getMax(dc));

一旦获得最大值,就可以更新另一个表

安杰洛

景承教
2023-03-14

您需要悲观锁定。使用Hibernate,您可以在JDBC或事务级别执行此操作。

阅读hibernate手册中关于锁定的章节。

皮自明
2023-03-14

您可以使用锁定。适当的锁定类型取决于您的使用案例。

如果并发更新的概率较低,请使用乐观锁定。在更新冲突的情况下,捕获Exception,刷新实体,重新应用您的更改并重试提交。

如果使用乐观锁定,建议在实体中添加@Version字段。不保证支持没有版本字段的乐观锁定。

如果并发修改的可能性很高,请使用悲观锁定。因此,您可以序列化对行的写入。请注意,这种类型的锁定可能会造成瓶颈,因为事务队列等待更新,其他事务在获取锁之前超时。

为了最小化lokc时间,您可以对单个查询应用锁:

query.setLockMode(LockMode.WRITE)

编辑:这些锁可能可以在分布式环境中安全地使用。

乐观锁定是在提交时(或等效情况下)作为对DB中的< code>@Version字段的检查来实现的——使用read-committed隔离(默认设置),没有丢失对实体的已提交更改的风险。

悲观锁定是在数据库级别实现的,通常使用< code>SELECT FOR UPDATE或类似的方法。所以你不用担心。

 类似资料:
  • 在下面的例子中,当在burst中调用事务性带注释的方法时,attachDirty总是尝试持久化实体。 有没有办法避免这个主键约束冲突异常?我认为如果实体尚未创建,则将持续存在,否则将进行更新。 我用了这个而不是来处理这些突发事件。 实际上没有数据损坏。因为第一个会根据需要为每个实体保存一条记录。由于主键约束冲突,数据库拒绝了其他持久化。 我研究了乐观锁定和悲观锁定。我知道这些工作是在获取一个已经存

  • 在以下代码中: 无论我是否注释/取消注释事务,它们都工作正常,即没有事务也保存操作成功执行。但是当我检查留档时,他们总是在插入更新删除之前使用事务。有什么具体原因吗?我错过了什么吗? 请告诉我这件事。我相当困惑:( 当做

  • 问题内容: 当前,我们在数据层中使用JDBC,并计划用hibernate代替它。我是Hibernate的新手,不确定Hibernate如何处理并发。如果我们使用spring进行事务管理,有人可以解释一下我如何处理并发更新:通过hibernate(在内存中进行hibernate的自动版本管理),或者我必须将version列放入数据库中以手动处理并发更新。 问题答案: 无论你是否使用Spring进行事

  • 我正在尝试使用Hibernate保存数据。一切都发生在同一会话中。逻辑如下: 1)开始交易并尝试保存: 2) 如果新记录违反完整性约束,请在外包装方法中捕获异常,打开另一个事务并查询更多数据 问题是当第二个事务执行时query.list它会抛出一个应该与前一个事务链接的异常。 SQLIntegrityConstraintViolationException:ORA-00001:唯一约束 我应该从另

  • 我正在实现一个JDBC数据库访问API(基本上是一个包装器),我正在使用来处理事务操作。看起来一切正常,但我无法理解jdbcTemplate如何管理并发事务。为了说明我的观点,我将在学生创造的基础上给你们一个简单的例子。让我们创建两个学生,约翰和杰克。第一个没有错误,第二个只有一个错误,下面是步骤和代码。 约翰开始交易 学生道 主控制程序 如何知道一个事务正常,而另一个事务不正常?据我所知,尽管我

  • 我想知道如何使用hyperledger Composer在hyperledger fabric中执行并发事务。当我试图针对同一资源同时提交两个事务时,会出现以下错误: