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

Spring Hibernate@Data update与raw update查询:尽管@Transactional,但乐观锁异常?

柴琦
2023-03-14

我正在使用Java Spring应用程序使用Spring Hibernate ORM进行MYSQL DBMS的数据管理。我有一个简单的要求--当有人使用我的应用程序时,我会将我数据库中的一个计数器增加1,这样我就可以跟踪我的用户的使用计数。

我这里有两个简单的实现我想讨论一下,一个给我一个在高负载下的乐观锁异常(我创建了一个多并发用户的模拟来测试负载),一个没有。有人能指导我理解这些差异,这些行为背后的原因,以及数据的正确性是否得到保证吗?

这里是我的第一个代码示例。在压力测试下,抛出OptimisticLockException。

@Transactional
public void updateLog() {
    ConnectionUseLog log = getLog();
    log.setCount(log.getCount() + 1);
    // ... other unrelated updates to database
}
@Data
public class ConnectionUseLog {
    @Version
    @Column(name="optlock_version")
    Integer version;
    @Column(name="count")
    Integer count;
}
    null
@Transactional
public void updateDailyLog() {
    incrementCount(1);
    // ... other unrelated updates to database
}

共有1个答案

王翰墨
2023-03-14

我不知道为什么您认为@transactional会使您的OptimisticLockingException消失。乐观锁定完全是关于不同事务的并发性。

它的工作方式是在每个事务中增加一个版本,并检查更新版本是否与加载实体时相同。

在高负载情况下,这通常会因以下一系列事件而失败:

    null
    null
 类似资料:
  • 在多用户环境中,在同一时间可能会有多个用户更新相同的记录,会产生冲突,解决方案有两种:乐观锁、悲观锁。 悲观锁在这里不讲,自行Google。 乐观锁假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性,不完整则更新失败。 乐观锁实现方式 使用整数表示数据版本号.更新时检查版本号是否一致,如果相等,则更新成功,且版本号+1.如果不等,则数据已经被修改过,更新失败。 使用时间戳来实现。 本质上也

  • 悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作 乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。 乐观锁与悲观锁的具体区别: http://www.cnblogs.com/Bob-FD/p/3352216.html

  • 乐观锁Version 要使用乐观锁,需要使用version标记 type User struct { Id int64 Name string Version int `xorm:"version"` } 在Insert时,version标记的字段将会被设置为1,在Update时,Update的内容必须包含version原来的值。 var user User engine

  • 本文向大家介绍Java并发问题之乐观锁与悲观锁,包括了Java并发问题之乐观锁与悲观锁的使用技巧和注意事项,需要的朋友参考一下 首先介绍一些乐观锁与悲观锁: 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。再

  • 我使用SpringDataJPA和Hibernate作为PostgreSQL上的持久性提供者。我试图提供悲观锁定: 我尝试从两个线程中调用< code>findOneAndLock。我认为,如果< code >线程A锁定了对象,那么< code >线程B应该等到锁被释放。而是< code >线程B抛出< code > org . spring framework . ORM . objectopt

  • 我知道使用版本列的Hibernate乐观锁定适用于并发更新。当记录被同时删除和重新插入时,它是否有效?