一般来说,我认为选择查询不需要交易。只有创建和更新操作需要事务。但是hibernate最新的文档示例使用事务来进行选择查询。有人可以澄清这个的原因吗?以下代码来自以下链接
http://docs.jboss.org/hibernate/orm/5.0/quickstart/html/
entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
List<Event> result = entityManager.createQuery( "from Event", Event.class).getResultList();
for ( Event event : result )
{
System.out.println( "Event (" + event.getDate() + ") : " + event.getTitle() );
}
entityManager.getTransaction().commit();
entityManager.close();
答案 0 :(得分:1)
是的,确实无法定义事务边界,因此乍一看似乎有点多余。
问题是如果您不使用交易会发生什么? In this blog post您可以阅读有关事务属性,隔离级别以及(不)使用事务时可能发生的“现象”。这种现象是“脏读”,“幻读”,“不可重复”读。通过使用事务(以及正确的隔离级别),您可以确保不会遇到这些问题。
<强> TL; DR 强> 一旦多个人/进程同时使用数据库,在查询数据库时使用事务就很重要。 (即并发)使用事务边界,您将消除(至少某些)并发数据库使用引入的问题。