2010-06-11 2 views
0

с транзакцией do, я определил метку, и на этой метке я обращаюсь к таблице с эксклюзивным блокировкой. И в конце метки я выполнил все изменения в этой таблице. bt теперь я с блоком транзакций. Теперь я попытался получить доступ к той же таблице в другом сеансе. Затем отобразится ошибка, таблица, используемая другим пользователем. Возможно ли, что мы можем освободить таблицу в транзакции, чтобы другой пользователь мог получить к ней доступ.Проблема с транзакциями и замками

Например:

Сессия 1)

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

Session 2)

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

ответ

4

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

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

FIND CURRENT tablerecord NO-LOCK. 

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

RELEASE tablerecord. 
+0

Спасибо Abe, но я хочу обновить одну и ту же запись во второй сессии, которая удерживается в сеансе one.Но я не могу уменьшить размер транзакции, потому что он будет влиять на условия. Это их любой другой альтернативный вариант, который я также могу обновить мои записи во второй сессии. – jay

+0

Jay, обновляя запись во втором сеансе, требует EXCLUSIVE-LOCK в записи, которая удерживается в первом сеансе и не будет выпущена до конца транзакции. Единственный способ, которым вы можете выполнить то, что вы пытаетесь сделать, - это 1) ограничить область транзакции, как указано в моем ответе, или 2) взять код блокировки записи в первом сеансе и сделать обновления во внешнем сеансе, например, используя вызов AppServer без статуса. –

+0

Abe, я могу сузить область транзакций bcz, для этого требуется много изменений. Я думаю, что второй вариант хорош. Я попробую этот второй. Но я попытался использовать внешнюю процедуру (без вызова AppServer) для обновления записи второго сеанса. Табель все еще был заблокирован. – jay

3

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