Hi Jan, Thanks a lot for the prompt and excellent answer; it makes perfect sense as the query being aborted used DOCUMENT(). I will prefix all those queries with the WITH clause from now on.
Cheers, Thomas On Wednesday, April 5, 2017 at 2:30:04 PM UTC+8, Jan wrote: > > Hi Thomas, > > this should only happen when such queries dynamically access collections, > so that it is not clear at query start with collections will be accessed. > This may be the case for graph traversals or for queries that invoke the > `DOCUMENT()` AQL function using runtime expressions or variables. > > Consider the following example: > > Query 1 (the read-only query) accesses collection A (which will be > read-locked when the query starts) > Query 2 (some other write query) may now start and try to write-lock > collections B and A. > > Query 2 may succeed in getting the lock for B, but not for A (because > query 1 has got it). > > If Query 1 now dynamically needs to access collection B, then none of the > two queries would make any progress: > - query 1 would need to wait for the lock on collection B (which is held > by query 2), > - query 2 would need to wait for the lock on collection A (which is held > by query 1) > > This is when the deadlock detection starts and will abort one of the > queries. This can also be a read-only query. > Deadlocks should not happen if all collections needed by a query can be > determined at query compile time. Then the locking order should be fully > deterministic and deadlock-free. > But when collections are accessed dynamically, there can be no > deterministic locking order. > A workaround for avoiding deadlocks is to specify extra collections (those > that will be accessed dynamically) in a `WITH` clause at the beginning of > an AQL query, e.g. > > WITH extracollection1, extracollection2 > FOR doc IN collection > ... > > Best regards > Jan > > > > Am Mittwoch, 5. April 2017 04:59:53 UTC+2 schrieb Thomas Weiss: >> >> Hi there, >> >> I've just seen in my logs that requests have failed with the "deadlock >> detected (while executing)" message, but those requests were all read-only >> AQL queries. How can such requests be involved in a deadlock? >> >> Thanks, >> Thomas >> > -- You received this message because you are subscribed to the Google Groups "ArangoDB" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
