为什么我需要在Hibernate中使用事务进行只读操作?
以下事务是否在数据库中设置了锁?
从数据库获取的示例代码:
Transaction tx = HibernateUtil.getCurrentSession().beginTransaction(); // why begin transaction?
//readonly operation here
tx.commit() // why tx.commit? I don't want to write anything
我可以使用会话吗。close()而不是tx.commit()?
事务确实在数据库上设置了锁——好的数据库引擎以合理的方式处理并发锁——并且对于只读使用非常有用,可以确保没有其他事务添加会导致视图不一致的数据。您总是想要一个事务(尽管有时调整隔离级别是合理的,但最好不要从一开始就这样做);如果在事务期间从未向数据库写入数据,那么提交和回滚事务都是一样的(而且非常便宜)。
现在,如果你很幸运,并且你对数据库的查询是这样的,ORM总是将它们映射到单个SQL查询,那么你可以不用显式事务,依赖于数据库的内置自动提交行为,但是ORM是相对复杂的系统,因此依赖这种行为根本不安全,除非你花更多的时间检查实现的实际功能。在中编写显式事务边界要容易得多(尤其是如果您可以使用AOP或类似的ORM驱动技术;从Java 7开始,我想也可以使用try with resources)。
所有数据库语句都在物理事务的上下文中执行,即使我们没有明确声明事务边界(例如,BEGIN、COMMIT、ROLLBACK)。
如果没有明确声明事务边界,则每个语句都必须在单独的事务中执行(autocommit
模式)。这甚至可能导致每个语句打开和关闭一个连接,除非您的环境可以处理每个线程的连接绑定。
将服务声明为Transactional将在整个事务持续时间内为您提供一个连接,并且所有语句都将使用该单个隔离连接。这比一开始不使用显式事务要好得多。
在大型应用程序上,您可能会有许多并发请求,降低数据库连接获取请求率肯定会提高您的整体应用程序性能。
JPA不会对读取操作强制执行事务。只有写入操作最终会抛出
Transaction必需异常
,以防您忘记启动事务上下文。尽管如此,即使对于只读事务,声明事务边界总是更好的(在Spring@Transactional
中,您可以标记只读事务,这具有很大的性能优势)。
用于读取的事务可能看起来确实很奇怪,在这种情况下,人们通常不会为事务标记方法。但JDBC无论如何都会创建事务,只是如果没有显式设置不同的选项,它将在autocommit=true下工作。但将交易标记为只读有一些实际原因:
不能保证您的方法不会写入数据库。如果您将方法标记为@Transactional(readonly=true)
,您将决定是否可以在此事务范围内写入数据库。如果您的架构很麻烦,并且一些团队成员可能会选择将修改查询放在不期望的地方,则此标志会将您指向有问题的地方。
问题内容: 为什么在Hibernate中需要事务才能进行只读操作? 以下事务是否在数据库中设置了锁定? 从数据库获取示例代码: 我可以 代替使用吗? 问题答案: 您实际上可能有理由将事务标记为只读。 阅读交易看起来确实很奇怪,在这种情况下,人们通常不会标记交易方法。但是JDBC仍然会创建事务,只是如果未显式设置其他选项,它将可以正常工作。 但是,不能保证您的方法不会写入数据库。如果将method标
问题内容: 为什么在Hibernate中需要事务处理才能进行只读操作? 以下事务是否在数据库中设置了锁定? 从数据库获取示例代码: 我可以 代替使用吗? 问题答案: 你实际上可能有理由将事务标记为只读。 阅读交易看起来确实很奇怪,在这种情况下,人们通常不会标记交易方法。但是JDBC仍然会创建事务,只是如果未明确设置其他选项,它将可以正常工作。 但是,不能保证你的方法不会写入数据库。如果将metho
问题内容: 我一直在研究只读数据库和读写数据库事务的性能。MySQL服务器通过缓慢的VPN链接处于远程状态,因此我很容易看到事务类型之间的差异。这是与连接池有关的,我知道它是基于比较第一个和第二个JDBC调用而工作的。 当我将Spring AOP配置为在我的DAO调用上使用只读事务时,与读写相比,调用的 速度要慢 30-40%: 与: 看一下tcpdump,似乎只读事务正在与MySQL进行来回通信
我在互联网上找到了例子,但这并没有给我充分的理解。使用WebFlux时的标准CRUD。 路由器: 处理程序: 我是对的还是这个说法错了?
问题内容: 我开始使用RxJS,但我不明白为什么在此示例中我们需要使用类似or 的函数;数组的数组在哪里? 如果有人可以直观地解释正在发生的事情,那将非常有帮助。 问题答案: 当您有一个Observable的结果是更多Observable时,可以使用flatMap。 如果您有一个由另一个可观察对象产生的可观察对象,则您不能直接过滤,缩小或映射它,因为您有一个可观察对象而不是数据。如果您生成一个可观
本文向大家介绍HTML5 为什么只需要写 ?相关面试题,主要包含被问及HTML5 为什么只需要写 ?时的应答技巧和注意事项,需要的朋友参考一下 1) HTML5不基于SGML,因此不需要对DTD进行引用,但是需要DOCTYPE来规范浏览器的行为(让浏览器按照他们应该的方式来运行); 2) HTML4.01基于SGML,所以需要对DTD进行引用,才能告知浏览器文档所使用的文档类型;