首页 > 解决方案 > 你什么时候会在 postgres 可序列化隔离级别上使用 Hibernate 乐观锁?

问题描述

美好的一天,我了解什么是可序列化隔离级别以及它与REPEATABLE READPostgres 中的不同之处。可序列化事务能够检测读写周期,因此只有第一次提交才会成功。

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

标签: javapostgresqlhibernateoptimistic-locking

解决方案


不要混淆REPEATABLE READand SERIALIZABLE:后者比前者强,前者不会产生额外的性能成本。REPEATABLE READ对于乐观锁定来说已经足够了。

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

使用REPEATABLE READ,您必须在同一个数据库事务中执行SELECT和 final 。UPDATE现在事务必须简短才能使数据库正常工作,因此如果涉及到例如用户交互,则使用REPEATABLE READ事务将是不可能的。

如果您想知道长REPEATABLE READ事务的坏处:

  1. 他们持有锁,可能会无限期地阻塞并发活动(想象你想ALTER TABLE在这个数据库中运行)

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


推荐阅读