Мы пытаемся использовать infinispan в качестве удаленного кэша с блокировкой чтения.Клиенты выполняют чтение с помощью «put», чтобы получить блокировку ключа, как описано в документации по бесконечности времени в разделе пессимистический транзакционный кеш «Когда возвращается cache.put (k1, v1), k1заблокирован, и никакая другая транзакция, выполняемая где-либо в кластере, не может записать в него. Чтение k1 все еще возможно. Блокировка на k1 снимается, когда транзакция завершается (фиксирует или выполняет откат). Таким образом, сценарий:
transactionManager.begin();
// read with put to acquire write lock
String value = getRemoteCache().get(key);
getRemoteCache().put(key, value);
// do smthing with the value
getRemoteCache().put(key, newValue);
transactionManager.commit();
удаленный кеш настроен как транзакционный с пессимистической блокировкой:
<local-cache name="default"> <locking isolation="REPEATABLE_READ" acquire-timeout="30000" concurrency-level="1000" striping="false"/>
<transaction mode="NON_XA" locking="PESSIMISTIC"/>
</local-cache>
, и клиенты обращаются к remoteCacheManager как клиент HOTROD с конфигурацией:
ConfigurationBuilder builder = new ConfigurationBuilder();
// add more configurations ?
builder.transaction().transactionManagerLookup(GenericTransactionManagerLookup.getInstance());
builder.transaction().transactionMode(TransactionMode.NON_XA);
builder.addServer().host(readServerHostConfiguration()).port(readServerPortConfiguration());
return new RemoteCacheManager(builder.build(), true);
Несмотря на то, что клиенты могут "читать с положенным положением "одно значение одновременно, клиенты Concurent не получают исключения при установке значения при его чтении, но только позже, совершая преобразование. Это ожидаемое поведение?