我们大多数人可能使用Spring和Hibernate进行数据访问。我试图了解的一些内部内容。
根据Spring,它支持不同的隔离级别-- 文档,但我无法找到明确的信息,在哪些情况下这些信息确实有助于提高性能。
我知道来自readOnly的Spring Transaction参数可以帮助我们使用不同的TxManagers来读取数据,并且可以利用良好的性能。但是它使用locks表来获取数据,以避免脏读/非提交读- 文档。
假设,在一些情况下,我们可能要盲目地将记录插入到表中,并在不锁定表的情况下检索信息,在这种情况下,我们从不更新表数据,只需插入和读取附加数据。我们能使用更好的隔离来获得任何性能吗?
发布于 2015-05-11 08:43:21
Read-only允许某些优化,比如禁用脏检查,当您不打算更改实体时,您应该完全使用它。
每个隔离水平都定义了数据库为确保防止数据异常而必须加多少锁。
大多数数据库使用MVCC (甲骨文、PostgreSQL、MySQL),因此读取器不会锁定作者,而写入器不会锁定读取器。正如您在中所看到的那样,只有的作者锁定了作者。
REPEATABLE_READ不必持有锁以防止并发事务修改当前事务加载的行。MVCC引擎允许其他事务读取行的提交状态,即使您的当前事务已经更改了它,但尚未提交(MVCC使用撤消日志来恢复pending changed行的前一个版本)。
在您的用例中,您应该使用READ_COMMITTED,因为它比其他更严格的隔离级别具有更好的伸缩性,并且您应该使用乐观锁定来防止长对话中丢失的更新。
更新
根据当前事务类型,将@Transactional(isolation = Isolation.SERIALIZABLE)设置为Spring有不同的行为:
RESOURCE_LOCAL事务,JpaTransactionManager可以为当前正在运行的事务应用特定的隔离级别。WebLogicJtaTransactionManager的示例重写它。发布于 2015-05-11 06:47:12
实际上,readOnly=true不会对数据库表造成任何锁争用,因为只是不需要锁定--数据库能够恢复到以前版本的记录,而忽略了所有新的更改。
以readOnly为真,在当前Hibernate会话中,您将以FlushMode.NEVER的形式进行刷新模式,从而防止会话提交事务。此外,将在JDBC连接上调用setReadOnly(true),这也是对底层数据库不提交更改的提示。
因此,readOnly=true正是您所要寻找的(例如,SERIALIZED隔离级别)。
这里是一个很好的解释。
https://stackoverflow.com/questions/30160926
复制相似问题