假设这段 Hiberante 代码片段:
session.beginTransaction();
Event event1 = session.load(1);
Event event2 = new Event(2);
event2.setNextEvent(event1);
event2.save();
session.getTransaction().commit();
我的问题是,这是否按预期工作?也就是说,我可以从数据库中读取某些内容,将其设置到另一个实体上,然后在单个事务中将该实体保存到数据库中吗?
换句话说,开始事务是否意味着“我将收集对数据库的所有查询,并保留它们,直到您告诉我提交它们”。 orr 真的只是意味着锁定而提交意味着解锁吗?
最佳答案
我已经读了你的例子好几遍了,但我不明白你在说什么。代码中没有任何更改或提交,也没有指示哪些内容正在等待提交,哪些内容没有。如果此代码位于使用 ORM(例如 hibernate)的典型系统中,那么我认为它不会有任何问题。
假设a
尚未提交到数据库,那么dao.findBar(a)
仍会返回它,因为它位于hibernates缓存中。假设它首先与 hibernate session 相关联。
dao.findBar(a)
应该返回 x
,前提是它符合与 a
相同的条件。即它已经存在或已与 hibernate session 关联。
因此,dao.findBar(x.getBaz())
也应该在假设相同类型的东西的情况下工作。
正如你所看到的,上面的陈述中有很多“大概”的内容。我怀疑如果没有更清晰的问题,您是否会得到更好的答案。
更复杂的是,你的问题没有提到 ORM,但你在评论中谈论了它们。因此我的评论假设是这种情况。如果您没有使用 ORM 并且您的 dao 直接通过 JDBC 访问数据库,那么答案将再次完全不同 - 取决于 dao 的内部编码。
关于java - 事务是否收集对数据库的查询或锁定数据库直到提交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4486460/