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

标签 java postgresql hibernate optimistic-locking

美好的一天,我了解什么是可序列化隔离级别以及它与 REPEATABLE READ 的区别在 Postgres 中。可序列化事务能够检测读写周期,因此只有第一次提交会成功。
考虑到这一点,使用 Hibernate's 有意义吗?基于行版本控制的乐观锁定?行版本控制将以完全相同的方式运行,如果版本列被更新,则将抛出 Java 异常,这将回滚事务。此外,根据 Postgres wiki ,如果某些更新是在应用程序级代码之外完成的(例如由 psql 运行的普通 sql 查询),则必须创建触发器。因此,在我的拙见中,Serializable 级别是对乐观锁定的替代,是这样还是在某些用例中您更喜欢乐观锁定?

最佳答案

不要混淆REPEATABLE READSERIALIZABLE : 后者强于前者,前者不会产生额外的性能成本。 REPEATABLE READ对于乐观锁就足够了。
我通常更喜欢使用数据库技术的乐观锁定,因为这会更便宜。但是,在一种情况下,我更喜欢应用程序端的乐观锁定:如果结果数据库事务需要很长时间。
REPEATABLE READ ,您必须执行 SELECT最后的UPDATE在同一个数据库事务中。现在事务必须是简短的数据库才能正常工作,因此如果涉及用户交互,请使用 REPEATABLE READ交易将是一个非启动器。
如果你想知道长的坏处REPEATABLE READ交易:

  • 它们持有锁,可能会无限期地阻塞并发 Activity (假设您想在此数据库中运行 ALTER TABLE)
  • 它们会阻止 autovacuum 的进展,从而使您的 table 膨胀
  • 关于java - 你什么时候会在 postgres 可序列化隔离级别上使用 Hibernate 乐观锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68075307/

    相关文章:

    java - 如何使用 JAXB 返回 XML 文件

    java - 在 spring mvc 中从 apache tomcat 服务器目录流式传输 html 页面中的视频

    mysql - PostgreSQL 上的公式查询

    arrays - 如何对 JSONB 数组的元素使用 LIKE?

    java - CascadeType.Persist 没有按预期工作

    java - 如何为项目列表设置默认值?

    java - 根据两支球队的历史预测谁将获胜

    sql - 无法找出确切的 PostgreSQL 查询

    java - org.hibernate.TransientObjectException : how to properly define one-to-one relationship?

    java - 在 Hibernate 中创建查询