Infinispan:锁定远程事务缓存
Infinispan : locking in remote transactional cache
我们尝试使用 infinispan 作为带有读锁的远程缓存。客户端正在使用 "put" 进行读取以获取密钥锁,如 悲观事务缓存 部分中描述的 infinispan 文档“当 cache.put (k1,v1) returns, 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>
并且客户端作为 HOTROD 客户端访问 remoteCacheManager,配置为:
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);
尽管客户端可以同时 "read with put" 一个值,但 Concurent 客户端在读取值时不会出现异常,但只会在稍后提交交易时出现异常。这是预期的行为吗?
是的,是的。
如文档 (Hot Rod Transaction) 中所述,客户端上的事务 运行 具有乐观语义。只有在提交期间才会获取锁。
悲观锁定事务仅在嵌入式模式下有效。
我们尝试使用 infinispan 作为带有读锁的远程缓存。客户端正在使用 "put" 进行读取以获取密钥锁,如 悲观事务缓存 部分中描述的 infinispan 文档“当 cache.put (k1,v1) returns, 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>
并且客户端作为 HOTROD 客户端访问 remoteCacheManager,配置为:
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);
尽管客户端可以同时 "read with put" 一个值,但 Concurent 客户端在读取值时不会出现异常,但只会在稍后提交交易时出现异常。这是预期的行为吗?
是的,是的。
如文档 (Hot Rod Transaction) 中所述,客户端上的事务 运行 具有乐观语义。只有在提交期间才会获取锁。
悲观锁定事务仅在嵌入式模式下有效。