Принципиально неважно, если два обработчика запишут что-то в одно место и примерно одновременно и в нем окажется запись непонятно кого из них.
Это громкое заявление. Тогда вам синхронизация как таковая не нужна, не нужны броудкасты и с востановлением проблем нету так как считай кашу разрешили.
Просто держите блок в кэше и всё чтения и запись идут с этим блоком. По таймеру делаете снепшот блока отправляете на сервер. И так же по таймеру считываете и обновляете блок. При желании меняете частоту таймера тем самым регулируете поток с сервера.
выкрутиться версиями блоков.
С версиями блоков много проблем. Откуда взять начальное значение? Что делать при переполнении# Тут лучше использовать дату-время.
А так пожалуй пока ваш пункт 2 самое хорошее решение.
Собственно, транзакции элементарные (и атомарные) - запись блока в таблицу и чтение блока из таблицы. Язык не поворачивается называть их транзакциями.
Ссылку выше я давал открываем определение читаем.
«Под транзакцией понимается неделимая с точки зрения воздействия на БД последовательность операторов манипулирования данными
Основное назначение транзакций в базе данных — переводить ее из одного согласованного состояния в другое.»
Видим что транзакция последовательность, то отдельно чтение и отдельно запись не является транзакциями.
Транзакция состоит в общем случае из 5 стадий.
Начало транзакции;
чтение данных;
обработка;
запись данных;
фиксация результата.
Отсюда вывод, надо подняться на ступеньку выше, над чтением и записью. А там мы можем обнаружить следующие операции:
- вставка
- удаление
- добавление
- изменение
- поиск
- выборка
- обработка
-- расчёт с накоплением
-- преобразование, трансформация.
Каждая такая операция кодируется своей транзакцией. Для каждой транзакции Вы должны указать её характеристики(READ UNCOMMITTED, WAIT | NO WAIT и тд).
Для каждой транзакции мы можем использовать свою стратегию планирования и оптимизации. Стратегия выбирается частично вручную, частично автоматически.
Пропускная способность хранилища возрастет?
Во-первых. Убираем блокировки пропускная способность возрастает. Прикладной программист вызывает операции выборки, поиска, удаления для него они выполняются последовательно. А в вашей прослойке вы будете исполнять их квазипараллельно. Если нет конфликта они выполнятся параллельно. Если есть, то последовательно.
Во-вторых. Так как вы прописываете характеристики у транзакций, то системы появляется возможность определить нужно ли для этой транзакции выполнять Write-update обновление кэша либо не нужно.
Но мешает блочность
Прочитайте учебник возможно откроете для себя много нового: Дэвид М. Хэррис, Сара Л. Хэррис Цифровая схемотехника и архитектура компьютера.