Изоляция транзакции Oracle

У меня есть метод SaveApp (), который деактивирует существующие записи и вставляет новую.

void SaveApp(int appID)
{
   begin transaction;
   update;
   insert;
   commit transaction;
}

Допустим, в таблице базы данных SalesApp у меня есть 2 записи с appID, равным 123;

  1. запись 1, appID 123, неактивный
  2. запись 2, appID 123, активный

Если я вызову этот метод SaveApp () в двух потоках одновременно, первая транзакция (давайте назовем ее T1 ) обновит существующие две записи, в то время как вторая транзакция (назовем это T2 ) ожидает.

после окончания T1 в этой таблице будет три записи. однако каким-то образом T2 не знает о вновь вставленной записи, запрос на обновление в T2 только обновляет две предыдущие записи и вставляет четвертую.

после вызова этих двух методов в базе данных у нас теперь будет 4 записи, 3-я и 4-я активны, что неверно.

  1. запись 1, appID 123, неактивная
  2. запись 2, appID 123, неактивная
  3. запись 3, appID 123, активная
  4. запись 4, appID 123, активная

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

Спасибо!

5
задан nandin 17 August 2010 в 12:26
поделиться