如何在liferay 7.3中实现事务性方法?

cld4siwp  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(740)

我创造了一个 scheduler 在同一事务中删除 DB 并在删除后插入新行。但是如果添加行失败,我就会丢失数据,因为删除操作是正确的。如何在同一事务中删除和添加数据以避免出错时丢失数据?我想在同一个表中进行删除和两个不同的加法运算。

vx6bjr1n

vx6bjr1n1#

有三种情况:
如果您的代码是“一切开始”的,则它位于service builder生成的localserviceimpl类的方法中:
liferay自动创建一个事务,该事务从第一个localserviceimpl中调用的第一个方法开始,并在该方法对其他localserviceimpl类所做的内部调用中传播。
因此,我们的想法是在localserviceinpl方法中有一个入口点,liferay将在其中自动启动事务,并从该方法调用必须在同一事务中执行的其他localserviceinpl方法。
注意:默认情况下,只有更改数据的方法(添加、更新、删除)才创建新事务。
如果代码位于mvcactioncommand中,则可以使用basetransactionalmvcactioncommand作为父类,并在dotTransactionAlCommand方法中实现代码。
您的代码将 Package 在新事务中
有关更多信息,请参阅:https://github.com/liferay/liferay-portal/blob/master/portal-kernel/src/com/liferay/portal/kernel/portlet/bridges/mvc/basetransactionalmvcactioncommand.java
如果代码在localserviceimpl类之外,则始终可以使用transactioninvokerutil手动创建事务:

import com.liferay.portal.kernel.transaction.*;
 import com.liferay.portal.kernel.service.*;
 import java.util.concurrent.*;

 private _invokeTransactionally(Callable callable)
     throws Throwable {

     Class<?>[] rollbackForClasses = new Class<?>[1];

     rollbackForClasses[0]=Exception.class;

     try {
         TransactionInvokerUtil.invoke(
             TransactionConfig.Factory.create(
                 Propagation.REQUIRED, rollbackForClasses), callable);
     }
     catch(Exception e) {
          // handle the exception
     }
 }

 Callable callable = new Callable<Void>() {
     Void call() throws Exception {
          // here insert your code
     }
 }

代码应该放在可调用类的内部。
要执行它:\ u invoketransactionally(callable);

相关问题