我创造了一个 scheduler 在同一事务中删除 DB 并在删除后插入新行。但是如果添加行失败,我就会丢失数据,因为删除操作是正确的。如何在同一事务中删除和添加数据以避免出错时丢失数据?我想在同一个表中进行删除和两个不同的加法运算。
scheduler
DB
vx6bjr1n1#
有三种情况:如果您的代码是“一切开始”的,则它位于service builder生成的localserviceimpl类的方法中:liferay自动创建一个事务,该事务从第一个localserviceimpl中调用的第一个方法开始,并在该方法对其他localserviceimpl类所做的内部调用中传播。因此,我们的想法是在localserviceinpl方法中有一个入口点,liferay将在其中自动启动事务,并从该方法调用必须在同一事务中执行的其他localserviceinpl方法。注意:默认情况下,只有更改数据的方法(添加、更新、删除)才创建新事务。如果代码位于mvcactioncommand中,则可以使用basetransactionalmvcactioncommand作为父类,并在dotTransactionAlCommand方法中实现代码。您的代码将 Package 在新事务中有关更多信息,请参阅: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 } }
代码应该放在可调用类的内部。要执行它:\ u invoketransactionally(callable);
1条答案
按热度按时间vx6bjr1n1#
有三种情况:
如果您的代码是“一切开始”的,则它位于service builder生成的localserviceimpl类的方法中:
liferay自动创建一个事务,该事务从第一个localserviceimpl中调用的第一个方法开始,并在该方法对其他localserviceimpl类所做的内部调用中传播。
因此,我们的想法是在localserviceinpl方法中有一个入口点,liferay将在其中自动启动事务,并从该方法调用必须在同一事务中执行的其他localserviceinpl方法。
注意:默认情况下,只有更改数据的方法(添加、更新、删除)才创建新事务。
如果代码位于mvcactioncommand中,则可以使用basetransactionalmvcactioncommand作为父类,并在dotTransactionAlCommand方法中实现代码。
您的代码将 Package 在新事务中
有关更多信息,请参阅:https://github.com/liferay/liferay-portal/blob/master/portal-kernel/src/com/liferay/portal/kernel/portlet/bridges/mvc/basetransactionalmvcactioncommand.java
如果代码在localserviceimpl类之外,则始终可以使用transactioninvokerutil手动创建事务:
代码应该放在可调用类的内部。
要执行它:\ u invoketransactionally(callable);