Java 如何在grails中执行mongodb两阶段提交?
我正在开发一个使用mongodb的系统。对于特定情况,我需要能够回滚保存。如何继续使用GORM 我只是按照办公室的指示做的。我的代码如下所示:Java 如何在grails中执行mongodb两阶段提交?,java,mongodb,grails,gorm,Java,Mongodb,Grails,Gorm,我正在开发一个使用mongodb的系统。对于特定情况,我需要能够回滚保存。如何继续使用GORM 我只是按照办公室的指示做的。我的代码如下所示: FinancialTransaction financialTransaction = createFinancialTransaction(transactionType, amount, from, to, process) financialTransaction = financialTransacti
FinancialTransaction financialTransaction = createFinancialTransaction(transactionType, amount, from, to,
process)
financialTransaction = financialTransaction.save(flush: true, failOnError: true)
financialTransaction.transactionStatus = FinancialTransactionStatusEnum.PENDING
financialTransaction = financialTransaction.save(flush: true, failOnError: true)
def transactionLineNumber = 1
financialTransaction.addToTransactionItems( new FinancialTransactionItem(financialAccount: from.financialAccount,
transactionLineNumber: transactionLineNumber++, debitAmount: amount, creditAmount: 0,
description: "Money debited from Unions account for loan." ))
financialTransaction.addToTransactionItems( new FinancialTransactionItem(financialAccount: to.financialAccount,
transactionLineNumber: transactionLineNumber++, creditAmount: amount, debitAmount: 0,
description: "Money credited to Coops account from a loan received from a Union." ))
financialTransaction.save( flush: true, failOnError: true)
financialTransaction.transactionItems.each() { transactionItem ->
financialAccount = transactionItem.financialAccount
if( financialAccount.pendingTransactions.contains(financialTransaction.id )) //transaction has been committed to this account(used during recovery)
return
delta = (transactionItem.debitAmount == 0) ? transactionItem.creditAmount : transactionItem.debitAmount
sign = (transactionItem.debitAmount == 0) ? 1.0 : -1.0
newBalance = financialAccount.totalBalance + delta * sign
financialAccount.totalBalance = newBalance
financialAccount.pendingTransactions << financialTransaction.id
financialAccount.save(flush: true, failOnError: true)
if(log.isDebugEnabled())
log.debug("Saved Financial Account Id: ${transactionItem.financialAccount.id} Balance: ${newBalance}")
new FinancialAccountChange(financialAccount: financialAccount, updatedBalance: newBalance,
delta: delta * sign, financialTransactionItem: transactionItem).save(flush: true, failOnError: true)
}
financialTransaction.transactionStatus = FinancialTransactionStatusEnum.COMMITTED
financialTransaction = financialTransaction.save(flush: true, failOnError: true)
financialTransaction.transactionItems*.financialAccount.each { fA ->
fA.pendingTransactions - financialTransaction.id
fA.save( flush: true, failOnError: true )
}
financialTransaction.transactionStatus = FinancialTransactionStatusEnum.DONE
financialTransaction = financialTransaction.save(flush: true, failOnError: true)
MongoDB中的两阶段提交不是原子的,如果您想要这样,那么您将需要一种实际支持的技术it@Sammaye我只想能够回滚。好的,这应该可以在85%的应用程序/数据库故障中实现,但是请记住,两阶段提交不是服务器端的,因此在某些情况下,应用程序可能仍然会遇到不一致的情况。不管怎样,我想我应该把这一点讲清楚,让你更加了解情况: