Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate中的多事务_Java_Hibernate - Fatal编程技术网

Java Hibernate中的多事务

Java Hibernate中的多事务,java,hibernate,Java,Hibernate,在一个会话中多次调用beginTransaction是否存在风险?我的意思是,例如: session.beginTransaction(); session.saveOrUpdate(object1); // .... some works session.beginTransaction(); session.delete(object2); // ... some other works session.getTransaction.commit(); 我这样做了,似乎没有问题(任何异常或

在一个会话中多次调用beginTransaction是否存在风险?我的意思是,例如:

session.beginTransaction();
session.saveOrUpdate(object1);
// .... some works
session.beginTransaction();
session.delete(object2);
// ... some other works
session.getTransaction.commit();

我这样做了,似乎没有问题(任何异常或警告)。事实上,我想知道当我以这种方式使用事务时会发生什么。

给出一个解释

beginTransaction()
开始一个工作单元并返回关联的事务对象如果需要新的基础事务,则开始该事务。否则,在现有基础事务的上下文中继续新的工作。返回的事务对象的类由属性hibernate.Transaction\u factory确定


所以-它没有效果,它继续使用现有事务。所以不要这样做,因为这可能会让读者(包括你)感到困惑。如果先提交第一个事务,然后启动第二个事务,则可以有多个事务。

是。不会抛出任何编译/运行时异常。但是,可能会出现不希望出现的结果,导致部分未保存的数据。我以前曾遇到过这个问题

即使它能工作,它也会在应用程序中显示出设计问题,使事情变得非常混乱。@我使用getCurrentSession获取会话,并告诉Hibernate广泛获取当前会话线程。因为我的线程可能(也可能不会)在许多方法中执行许多工作,所以我想确定事务的开始。我将在线程执行结束时提交所有工作。如果这些对象具有关系,则只需在关系上设置一个CascadeType来执行您需要的操作,或者您可以使用EntityManager实现,而不是直接使用会话,这样,在一个事务中,您可以告诉它保持、更新、,删除任何内容。相关:为什么?不会有任何意外的结果。检查我的答案。数据库供应商不支持嵌套事务。JTA规范通过暂停一个事务(通过TransactionManager接口)以允许使用另一个Tx来绕过它。Hibernate可以在JDBC Tx mode.JTA中模拟这一点-也许,但Hibernate明确表示它不做任何“古怪”的事情,只是继续使用相同的事务Hibernate使用JDBC(或JTA)事务,它们不能嵌套。您需要的是一个跨越多个数据库事务的“应用程序事务”。看一下文档中的乐观并发控制和自动版本检查。所以,您从hibernate论坛复制粘贴了该评论?:)