问题描述
我创建了一个 scheduler
,它在同一个事务中删除 DB
中的行并在删除后插入新行。
但是如果添加行失败,我会丢失数据,因为删除是正确的。
如何删除和添加相同的事务以避免在出现错误时丢失数据?
我想在同一个表中进行删除和两个不同的添加。
解决方法
分三种情况:
-
如果你的代码一切都在一个方法中,一个由服务构建器生成的 LocalServiceImpl 类:
- Liferay 自动创建一个事务,该事务从第一个 LocalServiceImpl 中调用的第一个方法开始,并在该方法对其他 LocalServiceImpl 类的方法执行的内部调用中传播。
- 因此,我们的想法是在 LocalServiceImpl 方法中设置一个入口点,Liferay 将在该方法中自动启动事务,并从该方法调用必须在同一事务中执行的其他 LocalServiceImpl 方法。
- 注意:默认情况下,只有更改数据的方法(添加、更新、删除)才会创建新事务。
-
如果您的代码在 MVCActionCommand 中,您可以使用 BaseTransactionalMVCActionCommand 作为父类并在 doTransactionalCommand 方法中实现您的代码。
-
如果您的代码在 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);