details:   https://code.openbravo.com/erp/devel/pi/rev/d6f59afe1b6c
changeset: 31718:d6f59afe1b6c
user:      Atul Gaware <atul.gaware <at> openbravo.com>
date:      Sat Mar 11 00:46:09 2017 +0530
summary:   Fixes Issue 35137: Concurrency problem: current balance wrongly 
calculated
when 2 transactions are processed at same time

Lock added at database level for financial account being used while processing
or reactivating transaction.

details:   https://code.openbravo.com/erp/devel/pi/rev/5df11a528146
changeset: 31719:5df11a528146
user:      Atul Gaware <atul.gaware <at> openbravo.com>
date:      Tue Mar 21 10:09:56 2017 +0530
summary:   Related to issue 35137: Avoid financial account lazy initialization 
error

diffstat:

 
modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/process/FIN_TransactionProcess.java
 |  21 ++++++++-
 
modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/utility/FIN_Utility.java
            |   7 ++-
 2 files changed, 23 insertions(+), 5 deletions(-)

diffs (81 lines):

diff -r 2b7d3c3a9c32 -r 5df11a528146 
modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/process/FIN_TransactionProcess.java
--- 
a/modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/process/FIN_TransactionProcess.java
 Tue Mar 21 14:26:23 2017 +0000
+++ 
b/modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/process/FIN_TransactionProcess.java
 Tue Mar 21 10:09:56 2017 +0530
@@ -11,7 +11,7 @@
  * under the License.
  * The Original Code is Openbravo ERP.
  * The Initial Developer of the Original Code is Openbravo SLU
- * All portions are Copyright (C) 2010-2016 Openbravo SLU
+ * All portions are Copyright (C) 2010-2017 Openbravo SLU
  * All Rights Reserved.
  * Contributor(s):  ______________________________________.
  *************************************************************************
@@ -22,6 +22,9 @@
 import java.util.List;
 
 import org.apache.commons.lang.StringUtils;
+import org.hibernate.LockOptions;
+import org.hibernate.Query;
+import org.hibernate.Session;
 import org.hibernate.criterion.Restrictions;
 import org.openbravo.advpaymentmngt.APRM_FinaccTransactionV;
 import org.openbravo.advpaymentmngt.dao.AdvPaymentMngtDao;
@@ -113,7 +116,7 @@
           throw new OBException(msg);
         }
 
-        final FIN_FinancialAccount financialAccount = transaction.getAccount();
+        final FIN_FinancialAccount financialAccount = 
lockFinAccount(transaction.getAccount());
         
financialAccount.setCurrentBalance(financialAccount.getCurrentBalance().add(
             
transaction.getDepositAmount().subtract(transaction.getPaymentAmount())));
         transaction.setProcessed(true);
@@ -218,7 +221,7 @@
           OBContext.restorePreviousMode();
         }
         transaction.setProcessed(false);
-        final FIN_FinancialAccount financialAccount = transaction.getAccount();
+        final FIN_FinancialAccount financialAccount = 
lockFinAccount(transaction.getAccount());
         financialAccount.setCurrentBalance(financialAccount.getCurrentBalance()
             
.subtract(transaction.getDepositAmount()).add(transaction.getPaymentAmount()));
         OBDal.getInstance().save(financialAccount);
@@ -366,4 +369,16 @@
     return confirmation;
   }
 
+  private static FIN_FinancialAccount lockFinAccount(FIN_FinancialAccount 
account) {
+    StringBuilder queryStr = new StringBuilder(
+        "select a from FIN_Financial_Account a where id = :id");
+    final Session session = OBDal.getInstance().getSession();
+    final Query query = session.createQuery(queryStr.toString());
+    query.setParameter("id", account.getId());
+    query.setMaxResults(1);
+    query.setLockOptions(LockOptions.UPGRADE);
+    OBDal.getInstance().getSession().evict(account);
+    return (FIN_FinancialAccount) query.uniqueResult();
+  }
+
 }
diff -r 2b7d3c3a9c32 -r 5df11a528146 
modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/utility/FIN_Utility.java
--- 
a/modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/utility/FIN_Utility.java
    Tue Mar 21 14:26:23 2017 +0000
+++ 
b/modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/utility/FIN_Utility.java
    Tue Mar 21 10:09:56 2017 +0530
@@ -11,7 +11,7 @@
  * under the License.
  * The Original Code is Openbravo ERP.
  * The Initial Developer of the Original Code is Openbravo SLU
- * All portions are Copyright (C) 2010-2016 Openbravo SLU
+ * All portions are Copyright (C) 2010-2017 Openbravo SLU
  * All Rights Reserved.
  * Contributor(s):  ______________________________________.
  *************************************************************************
@@ -1439,7 +1439,10 @@
   public static String invoicePaymentStatus(FIN_PaymentMethod paymentMethod,
       FIN_FinancialAccount financialAccount, boolean isReceipt) {
     String status = null;
-    for (FinAccPaymentMethod finaccpaymentmethod : financialAccount
+    // Reload financial account to avoid lazy initialization when no session
+    FIN_FinancialAccount finAcct = 
OBDal.getInstance().get(FIN_FinancialAccount.class,
+        financialAccount.getId());
+    for (FinAccPaymentMethod finaccpaymentmethod : finAcct
         .getFinancialMgmtFinAccPaymentMethodList()) {
       if 
(finaccpaymentmethod.getPaymentMethod().getId().equals(paymentMethod.getId())) {
         if (isReceipt) {

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Openbravo-commits mailing list
Openbravo-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openbravo-commits

Reply via email to