java - Hibernate 事务管理比较

标签 java r hibernate jpa transactions

<分区>

引用 T1 和 T2,哪一个是创建 hibernate 事务的正确做法?我对选择其中之一有疑问。 我的问题是在什么情况下我应该像 T1 或 T2 这样编码。

T1

try{
    currentSession.beginTransaction();

    // assume assume this method is a hql select query
    Person person=personService.findPerson(personId);

    // complex rules that will affect performance
    Health health=healthService.calculateComplexBizRules(personId);

    person.setHealth(health);
    currentSession.commitTransaction();
}catch (Exception e) {
   rollBackTransaction();
   e.printStackTrace();
   throw e;
}

T2

try{
   currentSession.beginTransaction();

   // assume this method is a hql select query
   Person person=personService.findPerson(personId);
   currentSession.commitTransaction();

   // complex rules that will affect performance
   Health health=healthService.calculateComplexBizRules(personId);

   currentSession.beginTransaction();
   currentSession.persist(health);
   Person person=currentSession.merge(person);
   person.setHealth(health);
   currentSession.commitTransaction();
}catch (Exception e) {
   rollBackTransaction();
   e.printStackTrace();
   throw e;
}

最佳答案

T1 是全有或全无。

因此,如果 healthSerivce 会抛出异常,您可以回滚(或根据当时的应用程序框架自动回滚)事务。

对于取决于底层数据库的 T2,使用 find 的事务不会在数据库级别创建事务(例如使用 Oracle)。所以第一笔交易无论如何都没用。

如果您使用的是 Jakarta EE(以前的 J2EE/Java EE)或 Spring 等应用程序框架,您将拥有声明性的事务边界,它很可能看起来像 T1。

如果您的负载非常高,您可以使用 T2 来保持交易时间短。

总而言之:这取决于您的用例

关于java - Hibernate 事务管理比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56438439/

相关文章:

java - 无法从打开的网址获取输入流?

R chron times() 函数不起作用

java - JPA - 可选 = true 仍然给出 PropertyValueException

java - Envers在没有审计记录时在ValidityAuditStrategy中抛出RuntimeException(表分区)

java - AlarmManager 在 Android 8.1.0 中不工作

java - 如何使用扫描仪读取文件,然后将其放入二维字符数组中

java - 尽管正确的匹配项在字符串中,但未找到匹配项异常

r - 使用多个值变量 R 进行转换

r - 如何在 R Shiny 应用程序中显示嵌入的推文?

java - Hibernate 4.0、UserType 3.0.0.CR4 和 Joda Time 2.1 的映射异常