gpt4 book ai didi

postgresql - Hibernate 乐观锁定 Postgres 和 MariaDb 之间的不同行为

转载 作者:行者123 更新时间:2023-11-29 13:12:45 25 4
gpt4 key购买 nike

我刚刚发现,当我对 Postgresql 或 MariaDB 数据库使用乐观锁定时,我的应用程序表现不同,我想知道是否有人可以解释发生了什么,以及我如何才能使应用程序以与 MariaDB 相同的方式工作?我将 Postgresl 10.5 和 MariaDB 10.3.10 与 InnoDB 引擎和默认设置一起使用。我使用 Spring 框架版本 5.1.0 和 Hibernate 5.3.6。

所以我的代码是这样的:

@Entity
@Getter
@Setter
@NoArgsConstructor
public class Bla {

@Id
@GeneratedValue
private long id;

@Version
private long version;

private int counter;
}

我也有这个实体的存储库和以下服务方法:

@Transactional
public int increment(long id) {
Bla bla = blaRepo.getOne(id);
bla.setCounter(bla.getCounter() + 1);
return bla.getCounter();
}

如果我在多个线程上调用此方法,我希望如果它们接触具有相同版本的实体,更新只会对其中一个线程成功。例如:如果我在一次运行中使用 Postgres 数据库启动 50 个线程,我得到 3 个成功的调用并返回值 1、2、3,而其他 47 个失败并出现 ObjectOptimisticLockingFailureException,这是预期的行为 - 这就是我想要的方式应用程序的行为。

但是,如果我切换到 MariaDB,则不会发生这种情况。所有 50 个线程都成功完成,我在多个线程中获得相同的响应值,就好像没有乐观锁一样。例如,现在前 5 个线程返回 1,然后其中 20 个线程返回 2,其余 3 或 4。

为什么会这样?这没有任何意义 - 对于两个数据库,生成的查询都是

update bla set counter=?, version=? where id=? and version=?

但在 Postgresql 中会正确失败,而在 MariaDB 中会意外成功。

最佳答案

唯一可能发生的情况是 MariaDB 有一个错误,因为一旦 Tx 修改了一条记录,它将锁定它直到它提交或回滚。其他 Tx 会由于锁定而阻塞更新,但必须在释放锁定后重新评估条件。

尝试切换到 READ_COMMITTED 并查看它是否解决了问题。这可能是一个 REPEATABLE_READ 异常。

关于postgresql - Hibernate 乐观锁定 Postgres 和 MariaDb 之间的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52891978/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com