проблема изоляции транзакции или неправильно приближается?

Это должно быть очень легко. Вы можете сделать маску так:

mask = img2[..., 3] > 0

Затем, как вы сказали, просто сделайте:

img1[mask] = img2[mask]
7
задан Andrei Rînea 29 September 2008 в 19:09
поделиться

10 ответов

В зависимости от Вашего уровня изоляции выбор всех строк от таблицы не предотвращает новые вставки, это просто заблокирует строки, которые Вы читаете. В SQL Server при использовании Уровня сериализуемой изоляции затем, он предотвратит новые строки, если они включали бы в запрос Select.

http://msdn.microsoft.com/en-us/library/ms173763.aspx -

СЕРИАЛИЗУЕМЫЙ Указывает следующее:

  • Операторы не могут считать данные, которые изменялись, но еще не фиксировались другими транзакциями.

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

  • Другие транзакции не могут вставить новые строки со значениями ключа, которые упали бы в диапазоне ключей, считанных любыми операторами в текущей транзакции, пока текущая транзакция не завершается.

8
ответ дан 6 December 2019 в 07:08
поделиться

Это может быть достигнуто в использовании Oracle:

Alter session set isolation_level=serializable;

Это может быть установлено в МН использовании / использование SQL ВЫПОЛНЯЮТСЯ НЕПОСРЕДСТВЕННЫЙ:

BEGIN
    EXECUTE IMMEDIATE 'Alter session set isolation_level=serializable';
    ...
END;

Посмотрите спрашивает Tom: на уровнях изоляции транзакции

5
ответ дан 6 December 2019 в 07:08
поделиться

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

Простите синтаксис, я не протестировал этот код, но необходимо смочь получить идею:

INSERT INTO B SELECT * FROM A;

DELETE FROM A WHERE EXISTS (SELECT B.<primarykey> FROM B WHERE B.<primarykey> = A.<primarykey>);

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

Обновление: исправленный синтаксис в подзапросе

7
ответ дан 6 December 2019 в 07:08
поделиться

я не знаю, релевантно ли это, но в SQL Server синтаксис

begin tran
....
commit

не только 'начинаются'

1
ответ дан 6 December 2019 в 07:08
поделиться

Это - просто способ, которым работают транзакции. Необходимо выбрать корректный уровень изоляции для задачи под рукой.

Вы делаете, ВСТАВЛЯЮТ и УДАЛЯЮТ в той же транзакции. Вы не упоминаете, что транзакция режима изоляции использует, но она, вероятно, 'читала фиксировавший'. Это означает, что команда DELETE будет видеть записи, которые фиксировались тем временем. Для этого вида задания намного лучше использовать тип 'снимка' транзакции, потому что затем оба ВСТАВЛЯЮТ и УДАЛЯЮТ, знал бы о том же наборе записей - только они и ничто иное.

2
ответ дан 6 December 2019 в 07:08
поделиться

Необходимо установить уровень изоляции транзакции так, чтобы вставки от другой транзакции не влияли транзакцию. Я не знаю, как сделать это в Oracle.

1
ответ дан 6 December 2019 в 07:08
поделиться

В Oracle уровень изоляции транзакции по умолчанию читается фиксировавший. Это в основном означает, что Oracle возвращает результаты, поскольку они существовали в SCN (системное число изменения) когда Ваш запущенный запрос. Установка уровня изоляции транзакции к сериализуемому означает, что SCN получен в начале транзакции так все запросы в Ваших данных возврата транзакции с этого SCN. Это гарантирует последовательные результаты независимо от того, что делают другие сессии и транзакции. С другой стороны, может быть стоимость в том, что Oracle может решить, что не может сериализировать Вашу транзакцию из-за действия, которое выполняют другие транзакции, таким образом, необходимо было бы обработать такую ошибку.

Ссылка Tony на обсуждение AskTom входит к существенно большему количеству детали обо всем этом - я настоятельно рекомендую его.

1
ответ дан 6 December 2019 в 07:08
поделиться

Да Милан, я не указал уровень изоляции транзакции. Я предполагаю, что это - уровень изоляции по умолчанию, который я не знаю, который это. Ни в Oracle 11 г, ни в SQL Server 2005.

Кроме того, ВСТАВКА, которая была сделана во время команды WAIT (на 2-м соединении) НЕ была в транзакции. Это должно иметь для предотвращения этой потери данных?

0
ответ дан 6 December 2019 в 07:08
поделиться

Это - стандартное поведение значения по умолчанию фиксировавший чтению режим, как упомянуто выше. Правые дела команды WAIT задержка обработки, нет никакой ссылки ни на какую обработку транзакции DB.

Для решения проблемы, Вы можете также:

  1. установите уровень изоляции на сериализуемый, но затем можно получить РТЫ - ошибки, которые необходимо обработать с повторениями! Кроме того, можно было поразить серьезную производительность.
  2. используйте временную таблицу для хранения значений сначала
  3. если данные не являются слишком большими для вписывания в память, можно использовать пункт ВОЗВРАТА для УВЕЛИЧЕНИЯ ОБЪЕМА, СОБИРАЮТСЯ ВО вложенную таблицу и удаляют, только если строка присутствует во вложенной таблице.
0
ответ дан 6 December 2019 в 07:08
поделиться

В качестве альтернативы вы можете использовать изоляцию моментальных снимков для обнаружения потерянных обновлений:

Когда изоляция моментальных снимков помогает и когда это мешает

0
ответ дан 6 December 2019 в 07:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: