首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring事务隔离级别

Spring事务隔离级别
EN

Stack Overflow用户
提问于 2015-05-11 06:30:38
回答 2查看 5.2K关注 0票数 4

我们大多数人可能使用Spring和Hibernate进行数据访问。我试图了解的一些内部内容。

根据Spring,它支持不同的隔离级别-- 文档,但我无法找到明确的信息,在哪些情况下这些信息确实有助于提高性能。

我知道来自readOnlySpring Transaction参数可以帮助我们使用不同的TxManagers来读取数据,并且可以利用良好的性能。但是它使用locks表来获取数据,以避免脏读/非提交读- 文档

假设,在一些情况下,我们可能要盲目地将记录插入到表中,并在不锁定表的情况下检索信息,在这种情况下,我们从不更新表数据,只需插入和读取附加数据。我们能使用更好的隔离来获得任何性能吗?

  1. 正如您从一个参考链接中看到的,我们真的需要实现/编写我们自己的CustomJPADiaelect吗?
  2. 什么是更好的隔离我的要求?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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可以为当前正在运行的事务应用特定的隔离级别。
  • 对于JTA资源,事务作用域隔离级别不会传播到底层数据库连接,因为这是默认的JTA事务管理器行为。您可以按照WebLogicJtaTransactionManager的示例重写它。
票数 4
EN

Stack Overflow用户

发布于 2015-05-11 06:47:12

实际上,readOnly=true不会对数据库表造成任何锁争用,因为只是不需要锁定--数据库能够恢复到以前版本的记录,而忽略了所有新的更改。

以readOnly为真,在当前Hibernate会话中,您将以FlushMode.NEVER的形式进行刷新模式,从而防止会话提交事务。此外,将在JDBC连接上调用setReadOnly(true),这也是对底层数据库不提交更改的提示。

因此,readOnly=true正是您所要寻找的(例如,SERIALIZED隔离级别)。

这里是一个很好的解释。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30160926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档