Hi, I am trying to use intent locks within a transaction over multiple sessions. The documentation seems to say that one intent lock does allow other sessions to read the record but not to create another intent lock. However when I try that, all intent locks seem to be successful. In session1 (within a transaction) I create an intent lock by either: select id, c from tab holdlock where id = 1 or select id, c from tab where id = 1 for update by lock This does create a lock, updating the record does block, but when I issue the same select statements in session2 (also in a transaction) to get (or wait for) an intent lock, the lock also seems to be created for session2, the select returns immediately, i would expect the second select to block until the first session transaction is ended. I am using sybase ianywhere 11 Any idea what I am doing wrong or how to get a blocking state for the second session? Rob Gansevles asked 13 Oct '10, 12:18 Rob Gansevles Mark Culp |
HOLDLOCK does not acquire an intent row lock - the WITH( UPDLOCK ) table hint does. HOLDLOCK is equivalent to running the SELECT statement at isolation level 3. answered 13 Oct '10, 15:14 Glenn Paulley By the way, the HOLDLOCK syntax you are using is Transact-SQL. You will need to use WITH() syntax for the table hint if you are attempting to specify UPDLOCK. Thanks, with(updlock) is what I needed. Rob |
Ahhhh, locking... almost as complicated as cursors, and changing almost as fast :)
What version and build number of SQL Anywhere 11 are you running?