diff --git a/includes/commerce.controller.inc b/includes/commerce.controller.inc index 5605f67..48f3f1d 100644 --- a/includes/commerce.controller.inc +++ b/includes/commerce.controller.inc @@ -24,11 +24,17 @@ class DrupalCommerceEntityController extends DrupalDefaultEntityController imple * Override of DrupalDefaultEntityController::buildQuery(). * * Handle pessimistic locking. + * To load a readonly entity, e.g order, pass: $conditions['lock'] = FALSE */ protected function buildQuery($ids, $conditions = array(), $revision_id = FALSE) { - $query = parent::buildQuery($ids, $conditions, $revision_id); - - if (isset($this->entityInfo['locking mode']) && $this->entityInfo['locking mode'] == 'pessimistic') { + // By default DrupalCommerceEntityController will use pessimistic locking when loading orders + // Setting a $conditions['lock'] = FALSE flag to commerce_order_load or commerce_order_load_multiple + // will load an order readonly, without locking + // Default allow lock + $conditions['lock'] = isset($conditions['lock']) ? $conditions['lock'] : TRUE; + if (isset($this->entityInfo['locking mode']) && $this->entityInfo['locking mode'] == 'pessimistic' && $conditions['lock'] === TRUE) { + unset($conditions['lock']); // else is passed as field condition + $query = parent::buildQuery($ids, $conditions, $revision_id); // In pessimistic locking mode, we issue the load query with a FOR UPDATE // clause. This will block all other load queries to the loaded objects // but requires us to start a transaction. @@ -41,6 +47,10 @@ class DrupalCommerceEntityController extends DrupalDefaultEntityController imple // Store the ids of the entities in the lockedEntities array for later // tracking, flipped for easier management via unset() below. $this->lockedEntities += array_flip($ids); + }else{ + // If any of the above conditions fail, default regular query + unset($conditions['lock']); + $query = parent::buildQuery($ids, $conditions, $revision_id); } return $query; diff --git a/modules/order/commerce_order.module b/modules/order/commerce_order.module index 962d038..a4c2fcd 100644 --- a/modules/order/commerce_order.module +++ b/modules/order/commerce_order.module @@ -733,8 +733,8 @@ function commerce_order_save($order) { /** * Loads an order by ID. */ -function commerce_order_load($order_id) { - $orders = commerce_order_load_multiple(array($order_id), array()); +function commerce_order_load($order_id, $conditions = array()) { + $orders = commerce_order_load_multiple(array($order_id), $conditions); return $orders ? reset($orders) : FALSE; }