在创建/更新/删除时是否必须启动事务?

时间:2014-09-14 15:34:25

标签: java hibernate

我的hello world程序中有以下代码用于学习hibernate

Configuration cfg=new Configuration();
cfg.configure("hibernate.cfg.xml");

SessionFactory factory = cfg.buildSessionFactory();
Session session = factory.openSession();

Transaction  tx = session.beginTransaction();// line1
College college= new College();
session.saveOrUpdate(college);
tx.commit();//line2
session.close();
factory.close();

上面的代码成功地将大学实体保存在DB中,但如果我删除line1和line2, 它不是。在创建/更新/删除时是否必须开始交易?

如果是,在另一个应用程序中,我看到了

  

了Session.update(实体)

无需开始/结束事务即可成功运行。 我只是在session.update(entity)之后看到session.flush() 我不确定为什么它在没有交易边界的地方工作但在其他地方不工作?

更新: -

根据RADIM的回答我试过下面

Configuration cfg=new Configuration();
cfg.configure("hibernate.cfg.xml");

SessionFactory factory = cfg.buildSessionFactory();
Session session = factory.openSession();

College college= new College();
session.saveOrUpdate(college);
session.flush();
session.close();
factory.close();

但它并没有在DB中坚持学院

1 个答案:

答案 0 :(得分:1)

好处是,没有什么特别或令人惊讶的 只是 - 如果我们不使用显式事务,将使用每个单独的写操作的隐式事务。

没有显式事务begin()commit():
session.flush()将按预期执行每个WRITE操作。每项更改都将保留或不保留。它不会被视为一批操作 但结果是什么赢得了预期。可能会发生一些WRITE语句失败而有些会成功。不是我们想要的......

明确交易:
如果没有错误,所有WRITE语句都会成功,否则一切都会失败 这应该被标记为事实上只有预期的行为......

当然,虽然没有什么令人惊讶的 - 即使没有明确的交易,WRITE操作仍然有效 - 但这不是建议的方法。

建议:我们应该使用显式事务,以确保session.flush()将以一致的DB状态结束。