Это должно быть очень легко. Вы можете сделать маску так:
mask = img2[..., 3] > 0
Затем, как вы сказали, просто сделайте:
img1[mask] = img2[mask]
В зависимости от Вашего уровня изоляции выбор всех строк от таблицы не предотвращает новые вставки, это просто заблокирует строки, которые Вы читаете. В SQL Server при использовании Уровня сериализуемой изоляции затем, он предотвратит новые строки, если они включали бы в запрос Select.
http://msdn.microsoft.com/en-us/library/ms173763.aspx -
СЕРИАЛИЗУЕМЫЙ Указывает следующее:
Операторы не могут считать данные, которые изменялись, но еще не фиксировались другими транзакциями.
Никакие другие транзакции не могут изменить данные, которые были считаны текущей транзакцией, пока текущая транзакция не завершается.
Другие транзакции не могут вставить новые строки со значениями ключа, которые упали бы в диапазоне ключей, считанных любыми операторами в текущей транзакции, пока текущая транзакция не завершается.
Это может быть достигнуто в использовании Oracle:
Alter session set isolation_level=serializable;
Это может быть установлено в МН использовании / использование SQL ВЫПОЛНЯЮТСЯ НЕПОСРЕДСТВЕННЫЙ:
BEGIN
EXECUTE IMMEDIATE 'Alter session set isolation_level=serializable';
...
END;
Я не могу говорить с устойчивостью транзакции, но альтернативный подход должен был бы иметь второй шаг, удаляют из исходной таблицы, где существует (избранные идентификаторы от целевой таблицы).
Простите синтаксис, я не протестировал этот код, но необходимо смочь получить идею:
INSERT INTO B SELECT * FROM A;
DELETE FROM A WHERE EXISTS (SELECT B.<primarykey> FROM B WHERE B.<primarykey> = A.<primarykey>);
Тем путем Вы используете реляционный механизм для осуществления тех более новых данных, будет удален, и Вы не должны делать двух шагов в транзакции.
Обновление: исправленный синтаксис в подзапросе
я не знаю, релевантно ли это, но в SQL Server синтаксис
begin tran
....
commit
не только 'начинаются'
Это - просто способ, которым работают транзакции. Необходимо выбрать корректный уровень изоляции для задачи под рукой.
Вы делаете, ВСТАВЛЯЮТ и УДАЛЯЮТ в той же транзакции. Вы не упоминаете, что транзакция режима изоляции использует, но она, вероятно, 'читала фиксировавший'. Это означает, что команда DELETE будет видеть записи, которые фиксировались тем временем. Для этого вида задания намного лучше использовать тип 'снимка' транзакции, потому что затем оба ВСТАВЛЯЮТ и УДАЛЯЮТ, знал бы о том же наборе записей - только они и ничто иное.
Необходимо установить уровень изоляции транзакции так, чтобы вставки от другой транзакции не влияли транзакцию. Я не знаю, как сделать это в Oracle.
В Oracle уровень изоляции транзакции по умолчанию читается фиксировавший. Это в основном означает, что Oracle возвращает результаты, поскольку они существовали в SCN (системное число изменения) когда Ваш запущенный запрос. Установка уровня изоляции транзакции к сериализуемому означает, что SCN получен в начале транзакции так все запросы в Ваших данных возврата транзакции с этого SCN. Это гарантирует последовательные результаты независимо от того, что делают другие сессии и транзакции. С другой стороны, может быть стоимость в том, что Oracle может решить, что не может сериализировать Вашу транзакцию из-за действия, которое выполняют другие транзакции, таким образом, необходимо было бы обработать такую ошибку.
Ссылка Tony на обсуждение AskTom входит к существенно большему количеству детали обо всем этом - я настоятельно рекомендую его.
Да Милан, я не указал уровень изоляции транзакции. Я предполагаю, что это - уровень изоляции по умолчанию, который я не знаю, который это. Ни в Oracle 11 г, ни в SQL Server 2005.
Кроме того, ВСТАВКА, которая была сделана во время команды WAIT (на 2-м соединении) НЕ была в транзакции. Это должно иметь для предотвращения этой потери данных?
Это - стандартное поведение значения по умолчанию фиксировавший чтению режим, как упомянуто выше. Правые дела команды WAIT задержка обработки, нет никакой ссылки ни на какую обработку транзакции DB.
Для решения проблемы, Вы можете также:
В качестве альтернативы вы можете использовать изоляцию моментальных снимков для обнаружения потерянных обновлений:
Когда изоляция моментальных снимков помогает и когда это мешает