Мне нужно обновить строку в базе данных Oracle таким образом, чтобы я не заслонял изменения от другого клиента в своем веб-приложении.Условие гонки между select и update
В моей нынешней системе я выполнить следующие действия:
SELECT * FROM table WHERE id=:ID AND lastmodified=:LASTMOD
, если строка еще существует с тем же дату последнего изменения, когда мы начинали, мы знаем, что никто не изменил его, чтобы мы могли обновить с помощью последнего изменения.
Однако, когда вы делаете это вручную, используя два сеанса, я заметил, что два клиента выбирают примерно в одно и то же время, когда можно пропустить, что строка была изменена между этапом выбора и обновления из-за того, что они происходят в течение одной секунды или миллисекунды.
Конечным результатом является то, что я сжимаю изменения другого пользователя, и нет предупреждения о его возникновении.
Я думал об использовании SELECT FROM UPDATE, но, видимо, это bad idea (особенно для веб-приложений), статья рекомендует перечитывать (это то, что я делаю выше), но я все же думаю, что я подвергаюсь риску состояние гонки.
Редактировать: Понятно, что я был обеспокоен тем, как указано время.
Я думаю, что статья, на которую вы ссылаетесь, весьма сомнительна. В жизни DBA гораздо более жестокие баны, чем SELECT FOR UPDATE. Например, процессы, которые выполняют gazillions ненужных чтений и выполняют дополнительные задания вместо правильной стратегии блокировки. – APC
Реальная проблема с SELECT FOR UPDATE заключается в том, что она * stateful *, тогда как HTTP - * без гражданства *. Использование технологии, предназначенной для чтения документов для реализации приложений OLTP, является безумным и источником бесконечной печали, но, видимо, мы являемся индустрией мазохистов 8-) – APC
Я также читал http://broadh2o.net/docs/database /oracle/oracleLocks.html во время исследования этого вопроса, я был обеспокоен тем, как блокировка может застрять даже после того, как вы отключите «... завершение процесса не всегда приводит к блокировкам. Отключение рабочей станции до того, как вы вернетесь домой, не всегда выпускает блокировки Замки освобождаются только тогда, когда изменения совершаются или откатываются ». Поэтому я был обеспокоен тем, что произойдет, если я сделаю выбор для обновления, а затем не откат (хотя, я думаю, это все равно было бы риском, если бы у меня было незафиксированное обновление, так как это также заблокировало строку)? – TownCube