Моя программа на C # выполняет следующее (псевдокод):
START TRANSACTION READ COMMITTED
Select isOriginal, * from myTable where tnr = x;
//Record found?
Yes:
//isOriginal?
Yes:
update myTable set is_active = 0 where tnr = x;
No:
delete from myTable where tnr = x;
//Do some simple logic on the values
Insert into myTable (newvalues)
No:
return record_not_found;
END TRANSACTION
Однако, когда я запускаю два экземпляра моей программы и одновременно редактирую одну и ту же запись, вставляются две записи, поскольку обе они находят запись в запросе выбора.
Что должно произойти, так это то, что первая транзакция находит запись и вставляет новую строку, а вторая транзакция возвращает запись, не найденную.
Как я могу это исправить? Поместить мою транзакцию в сериализуемый? Проверить возвращаемое значение обновления / удаления? Какой лучший способ?
Редактировать :
Должно работать на Sybase, Oracle и SQL Server.