如何在 Liferay 7.3 中执行事务方法?

问题描述

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

解决方法

分三种情况:

  1. 如果你的代码一切都在一个方法中,一个由服务构建器生成的 LocalServiceImpl 类:

    • Liferay 自动创建一个事务,该事务从第一个 LocalServiceImpl 中调用的第一个方法开始,并在该方法对其他 LocalServiceImpl 类的方法执行的内部调用中传播。
    • 因此,我们的想法是在 LocalServiceImpl 方法中设置一个入口点,Liferay 将在该方法中自动启动事务,并从该方法调用必须在同一事务中执行的其他 LocalServiceImpl 方法。
    • 注意:默认情况下,只有更改数据的方法(添加、更新、删除)才会创建新事务。
  2. 如果您的代码在 MVCActionCommand 中,您可以使用 BaseTransactionalMVCActionCommand 作为父类并在 doTransactionalCommand 方法中实现您的代码。

  3. 如果您的代码在 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
    
              return null;
         }
     }
    
    • 您的代码应该放在 Callable 类中。
    • 执行:_invokeTransactionally(callable);

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...