java - 你什么时候会在 postgres 可序列化隔离级别上使用 Hibernate 乐观锁?
问题描述
美好的一天,我了解什么是可序列化隔离级别以及它与REPEATABLE READ
Postgres 中的不同之处。可序列化事务能够检测读写周期,因此只有第一次提交才会成功。
Hibernate's
考虑到这一点,使用基于行版本控制的乐观锁定是否有意义?行版本控制将以完全相同的方式运行,如果版本列已更新,则将引发 Java 异常,这将回滚事务。此外,根据Postgres wiki,如果某些更新是在应用程序级代码之外完成的(例如由 psql 运行的普通 sql 查询),则必须创建触发器。所以以我的拙见,可序列化级别是乐观锁定的替代品,是这样吗?还是在某些用例中您更喜欢乐观锁定?
解决方案
不要混淆REPEATABLE READ
and SERIALIZABLE
:后者比前者强,前者不会产生额外的性能成本。REPEATABLE READ
对于乐观锁定来说已经足够了。
我通常更喜欢使用数据库技术进行乐观锁定,因为这会更便宜。然而,有一种情况我更喜欢在应用程序端进行乐观锁定:如果生成的数据库事务需要很长时间。
使用REPEATABLE READ
,您必须在同一个数据库事务中执行SELECT
和 final 。UPDATE
现在事务必须简短才能使数据库正常工作,因此如果涉及到例如用户交互,则使用REPEATABLE READ
事务将是不可能的。
如果您想知道长REPEATABLE READ
事务的坏处:
他们持有锁,可能会无限期地阻塞并发活动(想象你想
ALTER TABLE
在这个数据库中运行)它们阻止了 autovacuum 的进程,从而使您的表膨胀
推荐阅读
- javascript - 这个函数中的细节是什么或意味着什么?
- python - '-' 的类型错误
- python - 获取包含 HTML 标签之外的匹配字符串的数组 - Python
- android - 从 Playstore 安装应用后获得推荐值
- python - Python 时间序列预测(销量)
- debugging - 如何将 Go 从 1.10 降级到 1.9?
- java - 如何在 Spring Boot 中使用 MySql 数据库查询?
- node.js - 尝试访问数据库和身份验证时 Firebase 初始化错误
- amazon-web-services - AWS DynamoDB 在本地开发环境的配置中缺少凭证
- android - 如何使用 Intent 从 WebView 拨打电话