Успешный параллелизм для операций обновления / удаления с использованием Spring-JDBC и MySQL - PullRequest
0 голосов
/ 06 июля 2011

Мы работаем над успокаивающим приложением, имеющим функцию «доски». Однажды я задал соответствующий вопрос: Есть ли здесь проблема параллелизма? Как это проверить во время разработки?

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

На доске несколько членов команды могут создавать / читать / обновлять / удалять записи. Конфликты, которые могут возникать в первую очередь, связаны с обновлением и удалением (немного устаревшее чтение считается нормальным, мы получаем периодические обновления)

Сценарий: Каждая запись , которая возвращается, имеет идентификатор, а также последнюю метку времени, установленную MySQL NOW () при первом создании записи.

Сценарий конфликта:

  1. Непосредственно перед обновлением проверьте, является ли временная метка действительной (или если строка вообще существует). По существу, запрос select * from ... where... сопровождается проверкой временной метки и обновляет, если то же самое еще «объединить» (то есть просто добавить к текущим данным с помощью ------- КОНФЛИКТ / ОБЪЕДИНЕННЫЙ ------- как разделитель)

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

Итак, вопрос в том, как на самом деле реализовать эту проверку параллелизма / конфликта? Сценарий должен быть атомарным, то есть проверить, существует ли значение / или оно одинаково, а затем обновить. Создание транзакции - путь? Я не уверен, что если просто выполнить транзакцию Spring и запустить 2 запроса (один для выбора и другой для обновления), то есть или есть синтаксис SQL, который мог бы помочь мне с этим требованием атомарности.

У меня вопрос "как это сделать"? Я читал о SELECT ... FOR ... UPDATE, но не понимаю, как это работает, и при этом я не понимаю, как SELECT ... LOCK IN SHARE MODE мог / мог бы решить проблему.

Любые идеи / указатели были бы очень полезны :) Использование Restlet / Spring-Jdbc / MySql

1 Ответ

0 голосов
/ 06 июля 2011

Если бы я был на вашем месте, я бы подключил весенний менеджер транзакций (http://static.springsource.org/spring/docs/3.0.x/reference/transaction.html)) и аннотировал бы либо методы dao, либо сервисного уровня с помощью @ Transaction.

Использование SELECT ... FOR ... UPDATEможно использовать, но вам нужно работать в очень параллельной среде, чтобы оправдать это

...