Как заставить БД возвращать разные строки для последующих транзакций? - PullRequest
2 голосов
/ 28 июля 2010

У меня нижеприведенный поток в многопоточной среде

  1. запуск транзакции
  2. чтение числа верхних строк (на основе столбца) из db
  3. проверить некоторые критерии
  4. обновить эти наборы строк
  5. зафиксировать / откатить транзакцию

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

Есть ли лучший способ справиться с этим?Можем ли мы заставить БД возвращать разные наборы строк для каждой транзакции, используя какую-то опцию?

1 Ответ

1 голос
/ 28 июля 2010

Причина, по которой вы получаете одинаковые топовые n записи для всех ваших тем, заключается в том, что I в ACID (атомарность, согласованность, изоляция, долговечность) принципы транзакций.Изоляция означает, что другие операции не могут получить доступ к данным, которые были изменены во время транзакции, которая еще не завершена.Таким образом, пока ваши потоки не передадут свои транзакции, другие потоки не смогут увидеть, что они сделали.

Можно изменить Уровень изоляции в большинстве баз данных на одну изследующее:

  • Сериализуемое
  • Повторное чтение
  • READ COMMITTED
  • READ UNCOMMITTED

В вашем случае вы вероятнохочу READ UNCOMMITTED, так как позволяет одной транзакции видеть незафиксированные изменения, сделанные другой транзакцией.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...