Как я могу использовать метод транзакций в Liferay 7.3?
Я создаю планировщик, который в той же транзакции удаляет строки в db и вставляет новые строки после удаления. Но если добавить строки не удалось, я потерял свои данные, потому что удаление было правильным. Как я могу удалить и добавить одну и ту же транзакцию, чтобы избежать потери данных в случае ошибок? Я хочу выполнить удаление и два разных добавления в одну и ту же таблицу.
1 ответ
Есть три случая:
Если в вашем коде все запускается, это метод класса LocalServiceImpl, созданный построителем служб:
- Liferay автоматически создает транзакцию, которая начинается в первом методе, вызываемом в первом LocalServiceImpl, и распространяется во внутренних вызовах, которые этот метод выполняет для методов других классов LocalServiceImpl.
- Таким образом, идея состоит в том, чтобы иметь точку входа в метод LocalServiceImpl, где Liferay будет автоматически запускать транзакцию, и из этого метода вызывать другие методы LocalServiceImpl, которые должны выполняться в той же транзакции.
Если ваш код находится в MVCActionCommand, вы можете использовать BaseTransactionalMVCActionCommand в качестве родительского класса и реализовать свой код в методе doTransactionalCommand .
- Ваш код будет заключен в новую транзакцию
- Для получения дополнительной информации см .: 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 } }
- Ваш код должен находиться внутри класса Callable.
- Для его выполнения: _invokeTransactionally(callable);