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