Просто задумайтесь здесь - если это проблема с пакетной поддержкой в драйвере, вы можете попытаться добиться того же, используя один запрос , что делает дозирование менее актуальным. (Как вы знаете, пакетирование о избежать задержек с несколькими запросами, но задержка по-прежнему присутствует, даже если дозирование один запроса.)
Вот как вы можете достичь оптимистического обновления с помощью одного запроса
- сборки временную таблицу, содержащую условия, необходимые для обновления строки, и перезапишите запрос на обновление, чтобы присоединиться к этой таблице. (например, внешнее соединение текущей метки времени в живых данных с временной меткой в вашей временной таблице.) Если временная метка живых данных не обновлена, строка будет выбрана из вашей временной таблицы.
Поскольку вы можете использовать временную таблицу в качестве запроса выбора, вы можете найти, какие строки будут обновлены, а затем отправить это как запрос на обновление. (Все в рамках транзакции, конечно.)
Для иллюстрации:
TempUpdateTable
---------------
id, // id of the row to be updated
timestamp, // timestamp data originally fetched
data1 // data to be updated
data2
dataN
Это дает идентификаторы всех данных, которые будут обновлены, которые можно хранить для последующего использования
SELECT d.id FROM TempUpdateTable t JOIN YourData d
ON t.id=d.id WHERE t.timestamp=d.timestamp
тот же запрос может быть использован в заявлении об обновлении
UPDATE YourData
SET data=t.data1
SET data=t.data2 //etc...
FROM TempUpdateTable t WHERE t.id IN
(SELECT d.in FROM TempUpdateTable t JOIN YourData d
ON t.id=d.id WHERE d.timestamp=d.timestamp)