gpt4 book ai didi

java - 创建/更新/删除时是否必须开始事务?

转载 作者:太空宇宙 更新时间:2023-11-04 06:33:03 24 4
gpt4 key购买 nike

我的 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();

上面的代码成功地将大学实体保存在数据库中,但是如果我删除第1行和第2行,它不是。创建/更新/删除时是否必须开始事务?

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

session.update(entity)

无需开始/结束事务即可成功工作。我只在 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

最佳答案

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

没有显式事务 begin() commit():
session.flush() 将按预期执行每个 WRITE 操作。每个更改都将单独保留或不保留。不会被视为批量操作。
但结果却不会如预期。可能会出现某些 WRITE 语句失败而某些成功的情况。这不是我们想要的...

使用显式交易:
如果没有错误,所有 WRITE 语句都会成功,否则全部都会失败。
事实上,这应该被标记为唯一的预期行为......

当然,虽然没有什么令人惊讶的 - 即使没有显式事务,WRITE 操作也可以工作 - 这不是建议的方法。

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

关于java - 创建/更新/删除时是否必须开始事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25834949/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com