如何解决如何在 Liferay 7.3 中执行事务方法?
我创建了一个 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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。