[java] 为什么我在Hibernate中需要Transaction才能进行只读操作?



1 Answers

事务确实将锁定放在数据库上 - 良好的数据库引擎以合理的方式处理并发锁定 - 并且对于只读使用非常有用,以确保没有其他事务添加使您的视图不一致的数据。 你总是想要一个交易(虽然有时调整隔离级别是合理的,但最好不要这样做); 如果您在交易期间从未写过数据库,那么提交和回滚交易的工作都是相同的(并且非常便宜)。

现在,如果你很幸运,你对DB的查询是这样的,ORM总是将它们映射到单个SQL查询,你可以在没有显式事务的情况下逃脱,依赖于DB的内置自动提交行为,但ORM是相对复杂的系统所以依靠这种行为是不安全的,除非你去做更多的工作来检查实现实际上做了什么。 编写显式事务边界更容易正确(特别是如果你可以使用AOP或类似的ORM驱动技术;从Java 7开始,我认为也可以使用try-with-resources)。

Question

为什么我在Hibernate中需要Transaction才能进行只读操作?
以下事务是否锁定了db?

从db获取的示例代码:

Transaction tx = HibernateUtil.getCurrentSession().beginTransaction(); // why begin transaction?
//readonly operation here

tx.commit() // why tx.commit? I don't want to write anything


我可以使用session.close()而不是tx.commit()吗?




无论您是否只读取 - 数据库必须仍然跟踪您的结果集,因为其他数据库客户端可能希望写入会更改结果集的数据。

我已经看到了错误的程序来杀死庞大的数据库系统,因为它们只是读取数据,但从不提交,迫使事务日志增长,因为DB无法在COMMIT或ROLLBACK之前释放事务数据,即使客户端什么也没做用了几个小时。




Related