[Java] 为什么我需要在Hibernate中进行只读操作?


Answers

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

现在,如果幸运的话,您对数据库的查询是ORM总是将它们映射到单个SQL查询的,那么您可以在没有显式事务的情况下依靠数据库的内置自动提交行为离开,但ORM是相对复杂的系统所以依靠这样的行为是不安全的,除非你去检查实现实际上做了多少工作。 编写明确的事务边界要容易得多(特别是如果你可以用AOP或类似的ORM驱动技术来做到这一点;从Java 7开始,我也可以使用试用资源)。

Question

为什么我需要在Hibernate中进行只读操作?
以下事务是否对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()吗?




无论您是否只读取数据都无关紧要 - 数据库必须跟踪结果集,因为其他数据库客户端可能想要写入可能会改变结果集的数据。

我看到有故障的程序会杀死巨大的数据库系统,因为它们只是读取数据,但从不提交,迫使事务日志增长,因为数据库无法在COMMIT或ROLLBACK之前释放事务数据,即使客户端没有执行任何操作用了几个小时。