jenny1371 opened a new pull request, #6591:
URL: https://github.com/apache/fineract/pull/6591

   …ransfers
   
   Two transfers in opposite directions (A to B and B to A) each update their 
own source account first and then wait for the other account: a deadlock, which 
PostgreSQL resolves by aborting one of them (the caller gets 409). Measured on 
a running instance with 10 transfers in each direction at the same time, 3 
rounds: 4 of 60 transfers succeeded and pg_stat_database reported 56 deadlocks. 
The database log shows the cycle on UPDATE m_savings_account ... WHERE id = ? 
AND version = ?.
   
   Lock both accounts (SELECT ... FOR UPDATE ... ORDER BY id) at the start of 
the transfer, in ascending id order, whatever the direction. This is done in 
create() (the API path) and in transferFunds() (the other callers). Transfers 
over the same pair of accounts now queue up behind each other instead of 
deadlocking. Same test after the change: 60 of 60 succeeded, 0 deadlocks; 20 
transfers in one direction: 20 of 20, balances moved by exactly 20; two 
independent crossing pairs: 40 of 40; a transfer above the balance is still 
answered with 403 and changes nothing.
   
   Tests: the accounts are locked in ascending order for both directions, null 
and duplicate ids are ignored, nothing is locked without ids.
   
   Assisted-By: claude-code-sonnet-5.5
   
   ## Description
   
   Describe the changes made and why they were made. (Ignore if these details 
are present on the associated Apache Fineract JIRA ticket.)
   
   ## Checklist
   
   Please make sure these boxes are checked before submitting your pull request 
- thanks!
   
   - [ ] Write the commit message as per [our 
guidelines](https://github.com/apache/fineract/blob/develop/CONTRIBUTING.md#pull-requests)
   - [ ] Acknowledge that we will not review PRs that are not passing the build 
_("green")_ - it is your responsibility to get a proposed PR to pass the build, 
not primarily the project's maintainers.
   - [ ] Create/update [unit or integration 
tests](https://fineract.apache.org/docs/current/#_testing) for verifying the 
changes made.
   - [ ] Follow our [coding 
conventions](https://cwiki.apache.org/confluence/display/FINERACT/Coding+Conventions).
   - [ ] Add required Swagger annotation and update API documentation at 
fineract-provider/src/main/resources/static/legacy-docs/apiLive.htm with 
details of any API changes
   - [ ] [This PR must not be a "code 
dump"](https://cwiki.apache.org/confluence/display/FINERACT/Pull+Request+Size+Limit).
 Large changes can be made in a branch, with assistance. Ask for help on the 
[developer mailing list](https://fineract.apache.org/#contribute).
   - [ ] If merging this PR resolves a JIRA issue, I will mark that issue as 
resolved and set "Fix Version/s" appropriately.
   - [ ] I followed the [AI 
Policy](https://github.com/apache/fineract/blob/develop/CONTRIBUTING.md#ai-policy).
   
   Your assigned reviewer(s) will follow our [guidelines for code 
reviews](https://cwiki.apache.org/confluence/display/FINERACT/Code+Review+Guide).
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to