3.8. 热 Rod Java 客户端事务
您可以在 JTA {tx}s 中配置和使用 Hot Rod 客户端。
要参与事务,Hot Rod 客户端需要与之交互的 {tm},以及它是否通过 {sync} 或 {xa} 接口参与事务。
事务在准备阶段获取条目的写锁是最佳的。为了避免数据不一致,请务必阅读有关 使用 Transactions 的冲突。
3.8.1. 配置服务器 复制链接链接已复制到粘贴板!
服务器中的缓存还必须是事务处理,客户端才能参与 JTA {tx}s。
需要以下服务器配置,否则只进行事务回滚:
-
隔离级别必须是
REPEATABLE_READ。 -
锁定模式必须是
PESSIMISTIC。在以后的发行版本中,支持OPTIMISTIC锁定模式。 -
事务模式应该是
NON_XA或NON_DURABLE_XA。热 Rod 事务不应使用FULL_XA,因为它会降低性能。
例如:
<replicated-cache name="hotrodReplTx"> <locking isolation="REPEATABLE_READ"/> <transaction mode="NON_XA" locking="PESSIMISTIC"/> </replicated-cache>
<replicated-cache name="hotrodReplTx">
<locking isolation="REPEATABLE_READ"/>
<transaction mode="NON_XA" locking="PESSIMISTIC"/>
</replicated-cache>
热 Rod 事务有自己的恢复机制。
3.8.2. 配置 Hot Rod 客户端 复制链接链接已复制到粘贴板!
在创建 {rcm} 时,您可以设置 {rc} 使用的默认 {tm} 和 {tx-mode}。
{rcm} 可让您只为事务缓存创建一个配置,如下例所示:
前面的配置应用到远程缓存的所有实例。如果需要将不同的配置应用到远程缓存实例,您可以覆盖 {rc} 配置。请参阅 覆盖 RemoteCacheManager 配置。
有关配置参数的文档,请参阅 {cb} Javadoc。
您还可以使用属性文件配置 Java Hot Rod 客户端,如下例所示:
infinispan.client.hotrod.transaction.transaction_manager_lookup = org.infinispan.client.hotrod.transaction.lookup.GenericTransactionManagerLookup infinispan.client.hotrod.transaction.transaction_mode = NON_XA infinispan.client.hotrod.transaction.timeout = 60000
infinispan.client.hotrod.transaction.transaction_manager_lookup = org.infinispan.client.hotrod.transaction.lookup.GenericTransactionManagerLookup
infinispan.client.hotrod.transaction.transaction_mode = NON_XA
infinispan.client.hotrod.transaction.timeout = 60000
3.8.2.1. TransactionManagerLookup Interface 复制链接链接已复制到粘贴板!
TransactionManagerLookup 提供了一个入口点,用于获取 {tm}。
TransactionManagerLookup 的可用实现:
- {gtml}
- 查找类,用于查找在 Java EE 应用服务器中运行的 {tm}。如果找不到 {tm},则默认为 {rtm}。这是 Hot Rod Java 客户端的默认设置。
在大多数情况下,{gtml} 适合。但是,如果您需要集成自定义 {tm},您可以实现 TransactionManagerLookup 接口。
- {rtml}
- 如果没有其他实现,则基本和易失性 {tm}。请注意,这个实现在处理并发事务和恢复时有很大的限制。
3.8.3. 事务模式 复制链接链接已复制到粘贴板!
{tx-mode} 控制 {rc} 与 {tm} 交互的方式。
在 Data Grid 服务器和您的客户端应用程序上配置事务模式。如果客户端试图对非事务缓存执行事务操作,则可能会出现运行时异常。
在 Data Grid 配置和客户端设置中,事务模式都相同。将以下模式与客户端搭配使用,请参阅服务器的 Data Grid 配置模式:
NONE- {rc} 不与 {tm} 交互。这是默认模式,不是事务处理模式。
NON_XA- {rc} 通过 {sync} 与 {tm} 交互。
NON_DURABLE_XA- {rc} 通过 {xa} 与 {tm} 交互。恢复功能被禁用。
FULL_XA-
{rc} 通过 {xa} 与 {tm} 交互。启用恢复功能。调用
XaResource.recover ()方法,以检索要恢复的事务。
3.8.4. 覆盖缓存实例的配置 复制链接链接已复制到粘贴板!
因为 {rcm} 不支持每个缓存实例的不同配置。但是,{rcm} 包含返回 {rc} 实例的 getCache (String) 方法,可让您覆盖一些配置参数,如下所示:
getCache (String cacheName, TransactionMode transactionMode)- 返回 {rc} 并覆盖配置的 {tx-mode}。
getCache (String cacheName, boolean forceReturnValue, TransactionMode transactionMode)- 与之前的相同,但也可为写操作强制执行返回值。
getCache (String cacheName, TransactionManager transactionManager)- 返回 {rc} 并覆盖配置的 {tm}。
getCache (String cacheName, boolean forceReturnValue, TransactionManager transactionManager)- 与之前的相同,但也可为写操作强制执行返回值。
getCache (String cacheName, TransactionMode transactionMode, TransactionManager transactionManager)-
返回 {rc} 并覆盖配置的 {tm} 和 {tx-mode}。如果
transactionManager或transactionMode为 null,则使用配置的值。 getCache (String cacheName, boolean forceReturnValue, TransactionMode transactionMode, TransactionManager transactionManager)- 与之前的相同,但也可为写操作强制执行返回值。
getCache (String) 方法返回 {rc} 实例,无论它们是事务。{rc} 包含 getTransactionManager () 方法,它返回了缓存使用的 {tm} 方法。如果 {rc} 不是事务处理,则方法会返回 null。
3.8.5. 使用事务检测冲突 复制链接链接已复制到粘贴板!
事务使用键的初始值来检测冲突。
例如,当事务开始时,"k" 的值为 "v"。在准备阶段,事务从服务器获取"k"以读取值。如果值已更改,事务会回滚以避免冲突。
事务使用版本来检测更改,而不是检查值相等。
forceReturnValue 参数控制对 {rc} 的写入操作,并帮助避免冲突。它有以下值:
-
如果为
true,则 {tm} 在执行写入操作前从服务器获取最新的值。但是,forceReturnValue参数仅适用于首次访问密钥的操作。 -
如果为
false,则 {tm} 在执行写入操作前不会从服务器获取最新的值。
此参数不会影响 替换 或放置 if Absent 等 条件 写入操作,因为它们需要最新的值。
以下事务提供了一个示例,其中 forceReturnValue 参数可以防止出现冲突的写入操作:
事务 1 (TX1)
事务 2 (TX2)
在这个示例中,TX1 和 TX2 并行执行。"k"的初始值为 "v"。
-
如果
forceReturnValue = true,则cache.put ()操作从 TX1 和 TX2 的服务器获取"k"的值。首先获取"k"锁定的事务,然后提交。其他事务会在提交阶段回滚,因为事务可以检测到 "k" 的值为 "v"。 -
如果
forceReturnValue = false,则cache.put ()操作不会从服务器获取"k"的值并返回 null。TX1 和 TX2 都可以成功提交,这会导致冲突。这是因为事务都无法检测到初始值为 "k" 已更改。
以下事务包括 cache.get () 操作,以便在执行 cache.put () 操作前读取 "k" 的值:
事务 1 (TX1)
事务 2 (TX2)
在前面的示例中,TX1 和 TX2 都是读取密钥,因此 forceReturnValue 参数不会生效。一个事务提交,另一个回滚。但是 cache.get () 操作需要额外的服务器请求。如果您不要求服务器请求的 cache.put () 操作返回值效率低下。
以下示例演示了如何使用在 RemoteCacheManager 中配置的 TransactionManager 和 TransactionMode :
3.8.7. 覆盖 Transaction Manager 复制链接链接已复制到粘贴板!
以下示例演示了如何使用 getCache 方法覆盖 TransactionManager :
3.8.8. 覆盖事务模式 复制链接链接已复制到粘贴板!
以下示例演示了如何使用 getCache 方法覆盖 TransactionMode :