Проблема транзакции и блокировки - PullRequest
0 голосов
/ 11 июня 2010

с помощью транзакции in, я определил метку, и в этой метке я обращаюсь к таблице с помощью exclusive-lock.and в конце метки я сделал все изменения в этой таблице.Теперь я в блоке транзакций.Теперь я попытался получить доступ к той же таблице в другом сеансе. Затем он показывает ошибку, таблица используется другим пользователем.Возможно ли, что мы можем освободить таблицу с помощью транзакции, чтобы другой пользователь мог получить к ней доступ?

Например:

Session 1)

DO TRANSACTION:
  ---
  ---
  loopb:
  REPEAT:
    --
    --
    ---------------------> control is here right now.
  END. /*repeat*/
  -- 
  --
END. /*do transaction*/

Сессия 2)

Я пытался получить доступ к той же таблице, но она выдает ошибку, что таблица заблокирована другим пользователем.

Ответы [ 2 ]

4 голосов
/ 11 июня 2010

Все те записи, к которым вы прикоснулись в цикле с использованием EXCLUSIVE-LOCK, не будут доступны для блокировки другим пользователем до тех пор, пока TRANSACTION не будет завершено. Обойти это невозможно. Если второй процесс должен заблокировать эти записи, то все, что вы можете сделать, это уменьшить область действия TRANSACTION в первом процессе. Это функция безопасности, так что если позже в TRANSACTION, all произойдет ошибка, изменения, сделанные во время TRANSACTION, будут отменены. Другой способ взглянуть на это - если бы вы могли снять некоторые блокировки записи во время TRANSACTION, вы бы потеряли атомарность (все или ничего), которая является частью определения TRANSACTION.

Следует отметить, что если вам действительно не нужно блокировать эти записи во втором процессе, а просто нужно увидеть их обновленное значение, это возможно. Когда обновленные записи больше не находятся в буфере записи (или статус блокировки записи понижен до NO-LOCK в TRANSACTION), они станут неопределенными блокировками, и вы можете просмотреть их обновленные значения, используя NO-LOCK. Чтобы последняя запись в цикле превратилась в подвешенную блокировку, вы можете сделать это

FIND CURRENT tablerecord NO-LOCK.

Или это, если вам больше не нужен доступ к буферу записи:

RELEASE tablerecord.
3 голосов
/ 25 июля 2010

Другие сеансы могут выполнить «грязное чтение» записи, используя NO-LOCK.Но они не смогут заблокировать или обновить его, пока транзакция не будет зафиксирована (или откатана).И этого не произойдет, пока блок повторения не будет повторен или вы не покинете его.

...