您什么时候会在 postgres 可序列化隔离级别上使用 Hibernate 乐观锁?

When would you use Hibernate optimistic lock over postgres serializable isolation level?

美好的一天,我了解什么是可序列化隔离级别以及它与 Postgres 中的 REPEATABLE READ 有何不同。可序列化 t运行saction 能够检测读写周期,因此只有第一次提交会成功。

考虑到这一点,使用 Hibernate's 基于行版本控制的乐观锁定是否有意义?行版本控制将以完全相同的方式运行,如果版本列已更新,则将抛出 Java 异常,这将回滚 t运行saction。此外,根据 Postgres wiki ,如果某些更新是在应用程序级代码之外完成的(例如 psql 的普通 sql 查询 运行),则必须创建触发器。因此,以我的愚见,可序列化级别是乐观锁定的替代品,是这样吗?或者在某些用例中您更喜欢乐观锁定?

不要混淆REPEATABLE READSERIALIZABLE:后者比前者强,前者不会产生额外的性能开销。 REPEATABLE READ 足以进行乐观锁定。

我通常更喜欢使用数据库技术进行乐观锁定,因为这样会更便宜。但是,在一种情况下,我更喜欢在应用程序端进行乐观锁定:如果生成的数据库事务需要很长时间。

对于 REPEATABLE READ,您必须在同一个数据库事务中执行 SELECT 和最后的 UPDATE。现在事务必须很短,数据库才能正常工作,所以如果涉及用户交互,使用 REPEATABLE READ 事务将是行不通的。

如果您想知道长 REPEATABLE READ 交易的坏处:

  1. 它们持有锁,可能会无限期地阻塞并发 activity(假设您想 运行 一个 ALTER TABLE 在此数据库中)

  2. 它们会阻止 autovacuum 的进程,从而使您的表膨胀

一个用例是长时间对话,请参见此处:https://vladmihalcea.com/preventing-lost-updates-in-long-conversations/)

在这种情况下,尽管为了避免丢失更新,(see here) 如果在 [=19] 中使用 postgres,除了 REPEATABLE READ 隔离级别外,您还应该使用开放式锁定=] 我认为需要 SERIALIZABLE