I am using mongodb transaction. Sometimes it may happen that for concurrent transaction in same document data update the second transaction will create transient transaction error
which will abort the second concurrent update.
In this case retry helps. My question is there better design for retry of the second transaction instead of recursive method call on error? Or retry is possible in mongodb query level ?
Note: I am using it in scala playframework with reactivemongo.
Should I create recursive method for retry in mongodb transaction to avoid document level lock error?
693 Views Asked by John At
1
There are 1 best solutions below
Related Questions in MONGODB
- Change size of bubble in Scatter Plot for c3.js
- D3 Mouseenter vs Mouseover
- Svg containers not positioning properly
- Bar chart columns not grouping in D3/C3
- Drill down capabality in C3.js
- Changing data sources with zoomable d3 treemap
- Repeat an object with different input data
- d3.js Line Chart Custom x-axis
- D3 Pie Chart with only one part of JSON data
- Prevent click action when dragging a D3 Node
Related Questions in PLAYFRAMEWORK
- Change size of bubble in Scatter Plot for c3.js
- D3 Mouseenter vs Mouseover
- Svg containers not positioning properly
- Bar chart columns not grouping in D3/C3
- Drill down capabality in C3.js
- Changing data sources with zoomable d3 treemap
- Repeat an object with different input data
- d3.js Line Chart Custom x-axis
- D3 Pie Chart with only one part of JSON data
- Prevent click action when dragging a D3 Node
Related Questions in TRANSACTIONS
- Change size of bubble in Scatter Plot for c3.js
- D3 Mouseenter vs Mouseover
- Svg containers not positioning properly
- Bar chart columns not grouping in D3/C3
- Drill down capabality in C3.js
- Changing data sources with zoomable d3 treemap
- Repeat an object with different input data
- d3.js Line Chart Custom x-axis
- D3 Pie Chart with only one part of JSON data
- Prevent click action when dragging a D3 Node
Related Questions in REACTIVEMONGO
- Change size of bubble in Scatter Plot for c3.js
- D3 Mouseenter vs Mouseover
- Svg containers not positioning properly
- Bar chart columns not grouping in D3/C3
- Drill down capabality in C3.js
- Changing data sources with zoomable d3 treemap
- Repeat an object with different input data
- d3.js Line Chart Custom x-axis
- D3 Pie Chart with only one part of JSON data
- Prevent click action when dragging a D3 Node
Related Questions in PLAY-REACTIVEMONGO
- Change size of bubble in Scatter Plot for c3.js
- D3 Mouseenter vs Mouseover
- Svg containers not positioning properly
- Bar chart columns not grouping in D3/C3
- Drill down capabality in C3.js
- Changing data sources with zoomable d3 treemap
- Repeat an object with different input data
- d3.js Line Chart Custom x-axis
- D3 Pie Chart with only one part of JSON data
- Prevent click action when dragging a D3 Node
Trending Questions
- UIImageView Frame Doesn't Reflect Constraints
- Is it possible to use adb commands to click on a view by finding its ID?
- How to create a new web character symbol recognizable by html/javascript?
- Why isn't my CSS3 animation smooth in Google Chrome (but very smooth on other browsers)?
- Heap Gives Page Fault
- Connect ffmpeg to Visual Studio 2008
- Both Object- and ValueAnimator jumps when Duration is set above API LvL 24
- How to avoid default initialization of objects in std::vector?
- second argument of the command line arguments in a format other than char** argv or char* argv[]
- How to improve efficiency of algorithm which generates next lexicographic permutation?
- Navigating to the another actvity app getting crash in android
- How to read the particular message format in android and store in sqlite database?
- Resetting inventory status after order is cancelled
- Efficiently compute powers of X in SSE/AVX
- Insert into an external database using ajax and php : POST 500 (Internal Server Error)
Popular # Hahtags
Popular Questions
- How do I undo the most recent local commits in Git?
- How can I remove a specific item from an array in JavaScript?
- How do I delete a Git branch locally and remotely?
- Find all files containing a specific text (string) on Linux?
- How do I revert a Git repository to a previous commit?
- How do I create an HTML button that acts like a link?
- How do I check out a remote Git branch?
- How do I force "git pull" to overwrite local files?
- How do I list all files of a directory?
- How to check whether a string contains a substring in JavaScript?
- How do I redirect to another webpage?
- How can I iterate over rows in a Pandas DataFrame?
- How do I convert a String to an int in Java?
- Does Python have a string 'contains' substring method?
- How do I check if a string contains a specific word?
Every driver for MongoDB has two types of APIs:
Callback API, that incorporates logic to
TransientTransactionError
.UnknownTransactionCommitResult
.Core API, that does not incorporate retry logic for the above errors, instead applications should explicitly implement retry logic for the error.
The default implementation of retry logic for the NodeJS driver can be found here and is probably the best one in 90% of the cases. As you can see the
attemptTransaction
method is recursively called untilMAX_WITH_TRANSACTION_TIMEOUT
(fixed to 2 minutes) is reached.Just for completeness, this approach of continuously rolling back and retrying the transaction is in line with the optimistic MVCC adopted by MongoDB, i.e. the snapshot isolation. The above errors are considered as transient errors, meaning that they are temporary and the transaction could be successful if restarted.
If you do not have any particular needs, then this implementation is good enough, otherwise your only choice is to use Core APIs and do it yourself. In this case you should provide additional info on why the default design available from Callback APIs is not suitable in your project.