java - 事务是否收集对数据库的查询或锁定数据库直到提交?

标签 java database hibernate orm transactions

假设这段 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/

相关文章:

Java:当我将数据附加到文本文件,同时运行独立于 Netbeans 的 .jar 时,为什么中文/日文字符显示为 '???'?

java - 如何解决java.util.NoSuchElementException?

mysql - 数据库设计 - 通用关系? (关系 ID,关系表)

带连接的 Mysql 触发器

java - 如何删除插入符号所在的 TextArea 行

java - 在 JUnit 4.11 中结合 @ClassRule 和 @Rule

c# - Asp.net MVC 休眠 : Can not modify more than one base table through a join view

mysql - 如何在 GORM 表架构更改后让系统正常工作?

java - 在新的事务范围内更新对象

java - Hibernate 搜索多个实体的查询