簡體   English   中英

我如何在 Liferay 7.3 中執行事務方法?

[英]How can i do a Transactional method in Liferay 7.3?

我創建了一個scheduler ,在同一事務中刪除DB中的行並在刪除后插入新行。 但是如果添加行失敗,我會丟失我的數據,因為刪除是正確的。 如何使用同一事務刪除和添加以避免在發生錯誤時丟失數據? 我想在同一個表中進行刪除和兩個不同的添加。

有以下三種情況:

  1. 如果您的代碼是一切開始的方法,則由服務生成器生成的 LocalServiceImpl class 方法:

    • Liferay 自動創建一個事務,該事務從第一個 LocalServiceImpl 中調用的第一個方法開始,並在該方法對其他 LocalServiceImpl 類的方法進行的內部調用中傳播。
    • 所以想法是在 LocalServiceImpl 方法中有一個入口點,Liferay 將自動啟動事務,並從該方法調用必須在同一事務中執行的其他 LocalServiceImpl 方法。
    • 注意:默認情況下,只有更改數據的方法(添加、更新、刪除)會創建新事務。
  2. 如果您的代碼在 MVCActionCommand 中,您可以使用 BaseTransactionalMVCActionCommand 作為父 class 並在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 return null; } }
    • 您的代碼應在 Callable class 內的 go 中。
    • 執行它: _invokeTransactionally(callable);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM