Как я могу использовать метод транзакций в Liferay 7.3?

Я создаю планировщик, который в той же транзакции удаляет строки в db и вставляет новые строки после удаления. Но если добавить строки не удалось, я потерял свои данные, потому что удаление было правильным. Как я могу удалить и добавить одну и ту же транзакцию, чтобы избежать потери данных в случае ошибок? Я хочу выполнить удаление и два разных добавления в одну и ту же таблицу.

1 ответ

Есть три случая:

  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
         }
     }
    
    • Ваш код должен находиться внутри класса Callable.
    • Для его выполнения: _invokeTransactionally(callable);
Другие вопросы по тегам