This is from a post Jeremy Sears made here on the ATG_Tech Google Group, but I thought it was nice and clear and worth reposting. All credit to Jeremy for this:
“In general, the design pattern for updating an order is as follows:
- Acquire lock-manager write lock on profile id from the /atg/commerce/order/LocalLockManager
- Begin Transaction
- Synchronize on the Order object.
- Modify Order
- Call ((OrderImpl) pOrder).updateVersion();
- Call OrderManager.updateOrder()
- Release Order synchronization
- End Transaction
- Release lock-manager write lock on profile id from the /atg/commerce/order/LocalLockManager
If you extend atg.commerce.order.purchase.PurchaseProcessFormHander, then steps 1,2,8 & 9 are done for you in the beforeSet and afterSet method implementations. Steps 3&7 are no longer strictly necessary, but are still good practice. Steps 3-7 should be performed manually in your application code. Calling step 6 within the transaction is mandatory and the lock manager work should always wrap the transaction to prevent some rare transaction race conditions. “
What is the significance of Synchronize on the order ? if we check the cartformhandler it is a request scope but still why
Synchronize on order is done ?
cartformhandler is request scoped but order resides in shopping cart which is A session scoped component. synchronize is make sure other processes dont have access to order object from the current session.
The wording on this is a bit out-of-date. See https://support.oracle.com/CSP/main/article?cmd=show&type=NOT&id=1362812.1 for the latest article on this. It does require Oracle support access to view.
Thanks Nick! Too bad it’s behind a paywall most individual devs may not have access to though. Any chance it can be made public? Or I can repost it here?
Hi Devon,
Sorry, Oracle knowledge content cannot be made public, nor can it be re-posted.
Thanks.
—
Nick Glover
Oracle Support for ATG Products
Calling updateVersion is a bit dangerous unless there is other preventions in place to prevent multiple sessions at the same time . It’s saying, forget everything and consider this copy of the order as the master, and then persist.
what if i did the lock on the orderID ? instead of profileid