Infinispan: блокировка в удаленном транзакционном кеше
Мы пытаемся использовать infinispan в качестве удаленного кэша с блокировкой чтения. Клиенты делают чтение с "пут", чтобы получить блокировку на ключ, как описано в бесконечно длительной документации в разделе " Пессимистический кеш транзакций ". Когда возвращается 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 не получают исключения при выставлении значения при его чтении, но только позже, совершая преобразование. Это ожидаемое поведение?
1 ответ
Да, это.
Как описано в документации ( http://infinispan.org/docs/stable/user_guide/user_guide.html) транзакция, выполняемая на клиенте, имеет оптимистическую семантику. Замки будут получены только во время коммита.
Транзакции с пессимистической блокировкой действительны только во встроенном режиме.