text:
|Message view
|« Date » · « Thread »
|« Date » · « Thread »
|[27/94] [abbrv] [partial] incubator-geode git commit: GEODE-1952 Consolidated docs under a single geode-docs directory
|Fri, 14 Oct 2016 22:17:25 GMT
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/ccc2fbda/geode-docs/developing/transactions/how_cache_transactions_work.html.md.erb ---------------------------------------------------------------------- diff --git a/geode-docs/developing/transactions/how_cache_transactions_work.html.md.erb b/geode-docs/developing/transactions/how_cache_transactions_work.html.md.erb new file mode 100644 index 0000000..fb914be --- /dev/null +++ b/geode-docs/developing/transactions/how_cache_transactions_work.html.md.erb @@ -0,0 +1,56 @@ +--- +title: How Geode Cache Transactions Work +--- + + + +This section provides an explanation of how transactions work on Geode caches. + +All the regions in a Geode member cache can participate in a transaction. A Java application can operate on the cache using multiple transactions. A transaction is associated with only one thread, and a thread can operate on only one transaction at a time. Child threads do not inherit existing transactions. + +- **[Transaction View](../../developing/transactions/how_cache_transactions_work.html#concept_hls_1j1_wk)** + +- **[Committing Transactions](../../developing/transactions/how_cache_transactions_work.html#concept_sbj_lj1_wk)** + +- **[Transactions by Region Type](../../developing/transactions/cache_transactions_by_region_type.html#topic_nlq_sk1_wk)** + +- **[Client Transactions](../../developing/transactions/client_server_transactions.html)** + +- **[Comparing Transactional and Non-Transactional Operations](../../developing/transactions/transactional_and_nontransactional_ops.html#transactional_and_nontransactional_ops)** + +- **[Geode Cache Transaction Semantics](../../developing/transactions/transaction_semantics.html)** + +## Transaction View + +A transaction is isolated from changes made concurrently to the cache. Each transaction has its own private view of the cache, including the entries it has read and the changes it has made. The first time the transaction touches an entry in the cache, either to read or write, it produces a snapshot of that entry's state in the transaction's view. The transaction maintains its current view of the entry, which reflects only the changes made within the transaction. The transaction remembers the entry's original state and uses it at commit time to discover write conflicts. + + + +## Committing Transactions + +When a commit succeeds, the changes recorded in the transaction view are merged into the cache. If the commit fails or the transaction is rolled back, all of its changes are dropped. + +When a transaction is committed, the transaction management system uses a two-phase commit protocol: + +1. Reserves all the entries involved in the transaction from changes by any other transactional thread. For distributed regions, it reserves the entries in the entire distributed system. For partitioned regions, it reserves them on the data store, where the transaction is running. +2. Checks the cache for conflicts on affected keys, to make sure all entries are still in the same state they were in when this transaction first accessed them. +3. If any conflict is detected, the manager rolls back the transaction. +4. If no conflict is detected, the manager: + 1. Calls the `TransactionWriter` in the member where the transaction is running. This allows the system to write through transactional updates to an external data source. + 2. Updates the local cache and distributes the updates to the other members holding the data. Cache listeners are called for these updates, in each cache where the changes are made, the same as for non-transactional operations. + 3. Calls the `TransactionListener`s in the member where the transaction is running. + +5. Releases the transaction reservations on the entries. + +The manager updates the local cache and distributes the updates to other members in a non-atomic way. + +- If other threads read the keys the transaction is modifying, they may see some in their pre-transaction state and some in their post-transaction state. +- If other, non-transactional sources update the keys the transaction is modifying, the changes may intermingle with this transaction's changes. The other sources can include distributions from remote members, loading activities, and other direct cache modification calls from the same member. When this happens, after your commit finishes, the cache state may not be what you expected. + +If the transaction fails to complete any of the steps, a CommitConflictException is thrown to the calling application. + +Once the members involved in the transaction have been asked to commit, the transaction completes even if one of the participating members were to leave the system during the commit. The transaction completes successfully so long as all remaining members are in agreement. + +Each member participating in the transaction maintains a membership listener on the transaction coordinator. If the transaction coordinator goes away after issuing the final commit call, the transaction completes in the remaining members. + + http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/ccc2fbda/geode-docs/developing/transactions/jca_adapter_example.html.md.erb ---------------------------------------------------------------------- diff --git a/geode-docs/developing/transactions/jca_adapter_example.html.md.erb b/geode-docs/developing/transactions/jca_adapter_example.html.md.erb new file mode 100644 index 0000000..1e562cd --- /dev/null +++ b/geode-docs/developing/transactions/jca_adapter_example.html.md.erb @@ -0,0 +1,34 @@ +--- +title: JCA Resource Adapter Example +--- + +This example shows how to use the JCA Resource Adapter in Geode . + +``` pre +Hashtable env = new Hashtable(); +env.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory"); +env.put(Context.PROVIDER_URL, "t3://localhost:7001"); +Context ctx = new InitialContext(env); +UserTransaction utx = (UserTransaction) ctx.lookup("javax.transaction.UserTransaction"); +utx.begin(); + // the XA Resource +javax.sql.DataSource ds = (DataSource) ctx.lookup("derby"); +javax.sql.Connection derbyConn = ds.getConnection(); +Statement stmt = conn.createStatement(); +stmt.executeUpdate("insert into test values(2,4) "); + // do ConnectionFactory lookup +GFConnectionFactory cf = (GFConnectionFactory) ctx.lookup("gfe/jca"); + + // Obtaining the connection begins the LocalTransaction. + // If this is absent, operations will not be part of any transaction. +GFConnection conn = cf.getConnection(); + +testRegion.put("foo", "bar-"); +utx.commit(); + + // the connection can also be closed within the transaction +derbyConn.close(); +conn.close(); +``` + + http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/ccc2fbda/geode-docs/developing/transactions/monitor_troubleshoot_transactions.html.md.erb ---------------------------------------------------------------------- diff --git a/geode-docs/developing/transactions/monitor_troubleshoot_transactions.html.md.erb b/geode-docs/developing/transactions/monitor_troubleshoot_transactions.html.md.erb new file mode 100644 index 0000000..6cb1b6c --- /dev/null +++ b/geode-docs/developing/transactions/monitor_troubleshoot_transactions.html.md.erb @@ -0,0 +1,39 @@ +--- +title: Monitoring and Troubleshooting Transactions +--- + +This topic covers errors that may occur when running transactions in Geode. + + +Unlike database transactions, Geode does not write a transaction log to disk. To get the full details about committed operations, use a transaction listener to monitor the transaction events and their contained cache events for each of your transactions. + +## Statistics on Cache Transactions + +During the operation of Geode cache transactions, if statistics are enabled, transaction-related statistics are calculated and accessible from the CachePerfStats statistic resource. Because the transaction's data scope is the cache, these statistics are collected on a per-cache basis. + +## Commit + +In a failed commit, the exception lists the first conflict that caused the failure. Other conflicts can exist, but are not reported. + +## Capacity Limits + +A transaction can create data beyond the capacity limit set in the region's eviction attributes. The capacity limit does not take effect until commit time. Then, any required eviction action takes place as part of the commit. + +## Interaction with the Resource Manager + +The Geode resource manager, which controls overall heap use, either allows all transactional operations or blocks the entire transaction. If a cache reaches the critical threshold in the middle of a commit, the commit is allowed to finish before the manager starts blocking operations. + +## Transaction Exceptions + +The following sections list possible transaction exceptions. + +**Exceptions Indicating Transaction Failure** + +- **`TransactionDataNodeHasDepartedException`**. This exception means the transaction host has departed unexpectedly. Clients and members that run transactions but are not a transaction host can get this exception. You can avoid this by working to ensure your transaction hosts are stable and remain running when transactions are in progress. +- **`TransactionDataNotColocatedException`**. You will get this error if you try to run a transaction on data that is not all located in the same member. Partition your data so that a single member contains all data that will be accessed as part of a single transaction. See [Transactions and Partitioned Regions](cache_transactions_by_region_type.html#concept_ysk_xj1_wk) and [Understanding Custom Partitioning and Data Colocation](../partitioned_regions/custom_partitioning_and_data_colocation.html#custom_partitioning_and_data_colocation). +- **`TransactionDataRebalancedException`**. You get this error if your transactional data is moved to another member for rebalancing during the transaction. Manage your partitioned region data to avoid rebalancing during a transaction. See [Rebalancing Partitioned Region Data](../partitioned_regions/rebalancing_pr_data.html#rebalancing_pr_data). + +**Exceptions Indicating Unknown Transaction Outcome** + +- **`TransactionInDoubtException`**. Some of the transactional operations may have succeeded and some may have failed. This can happen to clients and to any member running a transaction on another data host. To manage this, you may want to install cache listeners in the members running the transaction code. Use the listeners to monitor and record the changes you receive from your transactions so you can recover as needed if you get this exception. + http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/ccc2fbda/geode-docs/developing/transactions/run_a_cache_transaction.html.md.erb ---------------------------------------------------------------------- diff --git a/geode-docs/developing/transactions/run_a_cache_transaction.html.md.erb b/geode-docs/developing/transactions/run_a_cache_transaction.html.md.erb new file mode 100644 index 0000000..35ae027 --- /dev/null +++ b/geode-docs/developing/transactions/run_a_cache_transaction.html.md.erb @@ -0,0 +1,73 @@ +--- +title: How to Run a Geode Cache Transaction +--- + + + +This topic describes how to run a Geode cache transaction. + +Applications manage transactions on a per-cache basis. A Geode cache transaction starts with a `CacheTransactionManager.begin` method and continues with a series of operations, which are typically region operations such as region create, update, clear and destroy. The begin, commit, and rollback are directly controlled by the application. A commit, failed commit, or voluntary rollback by the transaction manager ends the transaction. + +You can run transactions on any type of cache region except regions with **global** scope. An operation attempted on a region with global scope throws an `UnsupportedOperationException` exception. + +A transaction may not be nested within another transaction. An attempt to begin a nested transaction will throw an `IllegalStateException` exception. + +This discussion centers on transactions on replicated and partitioned regions. If you use non-replicated distributed regions, follow the guidelines for replicated regions. + +1. **Configure the cache copy-on-read behavior in the members hosting the transactional data, or perform cache updates that avoid in-place changes.** This allows the transaction manager to control when cache updates are visible outside the transaction. See [Setting Global Copy on Read](working_with_transactions.html#concept_vx2_gs4_5k). +2. **Configure your regions for transactions in the members hosting the transactional data.** + + | If you use... | then you should... | + |---------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| + | **replicated regions** | Use `distributed-ack` scope. The region shortcuts specifying `REPLICATE` use `distributed-ack` scope. This is particularly important if you have more than one data producer. With one data producer, you can safely use `distributed-no-ack`. | + | **partitioned regions** | Custom partition and colocate data among regions so all the data for any single transaction is hosted by a single member. If the transaction is run from a member other than the one hosting the data, the transaction will run by proxy in the member hosting the data. The partitioned region must be defined for the application that runs the transaction, but the data can be hosted in a remote member. | + | **persistent regions** | Configure Geode to allow transactions on persistent regions. By default, the configuration does not allow transactions on persistent regions. Enable the use of transactions on persistent regions by setting the property `gemfire.ALLOW_PERSISTENT_TRANSACTIONS` to true. | + | **a mix of partitioned and replicated regions** | Make sure any replicated region involved in the transaction is hosted on every member that hosts the partitioned region data. All data for a single transaction must reside within a single host. | + | **delta propagation** | Set the region attribute `cloning-enabled` to true. This lets Geode do conflict checks at commit time. Without this, the transaction will throw an `UnsupportedOperationInTransactionException ` exception. | + | **global JTA transactions with only Geode cache transactions** | Set the region attribute `ignore-jta` to true for all regions that you do *not* want to participate in JTA global transactions. It is false by default. For instructions on how to run a JTA global transaction, see [JTA Global Transactions with Geode](JTA_transactions.html). | + +3. **Update your cache event handler and transaction event handler implementations to handle your transactions.** + Cache event handlers may be used with transactions. Cache listeners are called after the commit, instead of after each cache operation, and the cache listeners receive conflated transaction events. Cache writers and loaders are called as usual, at the time of the operation. + + Follow these additional guidelines when writing cache event handler callbacks: + - Make sure cache callbacks are transactionally aware, because a transactional operation could launch callbacks that are not transactional. + - Make sure cache listeners will operate properly, given entry event conflation. Two events for the same key are conflated by removing the existing event and queuing the new event. + + See [Using Cache Writer and Cache Listener Plug-Ins](working_with_transactions.html#concept_ysx_nf1_wk) for more information. + + Transaction event handlers are available. Transaction event handlers are cache-wide. You can install one transaction writer and any number of transaction listeners. Follow these guidelines: +
 +
Implement with synchronization for thread safety. Listener and writer handlers may be invoked at the same time by different threads for different transactions.
 +
Keep transactional callback implementations lightweight, and avoid doing anything that might cause the callbacks to block.
 +
 + See [Configuring Transaction Plug-In Event Handlers](working_with_transactions.html#concept_ocw_vf1_wk) for more information. + +4. **Write the transaction code.** For example: + + ``` pre + CacheTransactionManager txManager = + cache.getCacheTransactionManager(); + + try { + txManager.begin(); + // ... do work + txManager.commit(); + } catch (CommitConflictException conflict) { + // ... do necessary work for a transaction that failed on commit + } + ``` + + Follow these guidelines when writing the transaction: + - Start each transaction with a begin operation. + - Consider whether you will want to suspend and resume the transaction. If some operations should not be part of the transaction, you may want to suspend the transaction while performing non-transactional operations. After the non-transactional operations are complete, you can resume the transaction. See [Basic Suspend and Resume Transaction Example](transaction_suspend_resume_example.html#concept_40AAC4332DCE4E4EB60C4BA141B729A4) for an example. + - If your transaction operates on a mix of partitioned and replicated regions, do the first region operation on an entry of the partitioned region. This sets the host for the entire transaction. + - If you did not configure copy-on-read to true, be sure all cache updates avoid in-place changes. + - Take into account the behavior of transactional and non-transactional operations. All transactional operations that are run after the begin and before the commit or rollback are included in the transaction. + - End each transaction with a commit or a rollback. Do not leave any transaction in an uncommitted or unrolled back state. Transactions do not time out, so they will remain for the life of the application. + +5. **Review all of your code for compatibility with transactions.** + When you commit a transaction, while the commit is in process, the changes are visible in the distributed cache. This provides better performance than locking everything involved with the transaction updates, but it means that another process accessing data used in the transaction might get some data in the pre-transaction state and some in the post-transaction state. + + For example, suppose keys 1 and 2 are modified within a transaction, such that both values change from A to B. In another thread, it is possible to read key 1 with value B and key 2 with value A, after the commit begins, but before the commit completes. This is possible due to the nature of Geode reads. This choice sacrifices atomic visibility in favor of performance; reads do not block writes, and writes do not block reads. + + http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/ccc2fbda/geode-docs/developing/transactions/run_a_cache_transaction_with_external_db.html.md.erb ---------------------------------------------------------------------- diff --git a/geode-docs/developing/transactions/run_a_cache_transaction_with_external_db.html.md.erb b/geode-docs/developing/transactions/run_a_cache_transaction_with_external_db.html.md.erb new file mode 100644 index 0000000..474c139 --- /dev/null +++ b/geode-docs/developing/transactions/run_a_cache_transaction_with_external_db.html.md.erb @@ -0,0 +1,37 @@ +--- +title: How to Run a Geode Cache Transaction that Coordinates with an External Database +--- + +Coordinate a Geode cache transaction with an external database by using CacheWriter/CacheListener and TransactionWriter/TransactionListener plug-ins, **to provide an alternative to using JTA transactions**. + +There are a few things you should be careful about while working with Geode cache transactions and external databases: + +- When you set up the JDBC connection, make sure that auto-commit is disabled. For example, in Java: + + ``` pre + Connection getConnection() throws SQLException { + Connection con = ... // create the connection + con.setAutoCommit(false); + return con; + } + ``` + +- The BEGIN statement, database operations and the PREPARE statement must all happen in the same connection session. In order to accomplish this, you will need to obtain the same JDBC connection session across multiple CacheWriter and TransactionWriter/TransactionListener invocations. One way to do this would be to look up the connection (from a user managed Map) based on `cacheTransactionManager.getTransactionId()`. +- Make sure that the prepare transaction feature is enabled in your external database. It is disabled in PostgreSQL by default. In PostgreSQL, the following property must be modified to enable it: + + ``` pre + max_prepared_transactions = 1 # 1 or more enables, zero (default) disables this feature. + ``` + +Use the following procedure to write a Geode cache transaction that coordinates with an external database: + +1. Configure Geode regions as necessary as described in [How to Run a Geode Cache Transaction](run_a_cache_transaction.html#task_f15_mr3_5k). +2. Begin the transaction. +3. If you have not previously committed a previous transaction in this connection, start a database transaction by issuing a BEGIN statement. +4. Perform Geode cache operations; each cache operation invokes the CacheWriter. Implement the CacheWriter to perform the corresponding external database operations. +5. Commit the transaction. + At this point, the TransactionWriter is invoked. The TransactionWriter returns a TransactionEvent, which contains all the operations in the transaction. Call PREPARE TRANSACTION within your TransactionWriter code. + +6. After a transaction is successfully committed in Geode, the TransactionListener is invoked. The TransactionListener calls COMMIT PREPARED to commit the database transaction. + + http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/ccc2fbda/geode-docs/developing/transactions/transaction_coding_examples.html.md.erb ---------------------------------------------------------------------- diff --git a/geode-docs/developing/transactions/transaction_coding_examples.html.md.erb b/geode-docs/developing/transactions/transaction_coding_examples.html.md.erb new file mode 100644 index 0000000..f442e06 --- /dev/null +++ b/geode-docs/developing/transactions/transaction_coding_examples.html.md.erb @@ -0,0 +1,27 @@ +--- +title: Transaction Coding Examples +--- + +This section provides several code examples for writing and executing transactions. + +- **[Basic Transaction Example](../../developing/transactions/transactions_overview.html)** + + This example operates on two replicated regions. It begins a transaction, updates one entry in each region, and commits the result. + +- **[Basic Suspend and Resume Transaction Example](../../developing/transactions/transaction_suspend_resume_example.html)** + + This example suspends and resumes a transaction. + +- **[Transaction Embedded within a Function Example](../../developing/transactions/transactional_function_example.html)** + + This example demonstrates a function that does transactional updates to Customer and Order regions. + +- **[Geode JTA Transaction Example](../../developing/transactions/transaction_jta_gemfire_example.html)** + + An example code fragment shows how to run a JTA global transaction using Geode as the JTA transaction manager. + +- **[JCA Resource Adapter Example](../../developing/transactions/jca_adapter_example.html)** + + This example shows how to use the JCA Resource Adapter in Geode . + + http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/ccc2fbda/geode-docs/developing/transactions/transaction_event_management.html.md.erb ---------------------------------------------------------------------- diff --git a/geode-docs/developing/transactions/transaction_event_management.html.md.erb b/geode-docs/developing/transactions/transaction_event_management.html.md.erb new file mode 100644 index 0000000..9506f3d --- /dev/null +++ b/geode-docs/developing/transactions/transaction_event_management.html.md.erb @@ -0,0 +1,39 @@ +--- +title: How Transaction Events Are Managed +--- + +Transactional cache operations are handled somewhat differently inside transactions than out. + +# During the Transaction + +While the transaction is running, each transactional operation is passed to the cache writer local to the transactional view, if one is available. As with cache operations outside of transactions, the cache writer can abort the operation. Each operation the cache writer allows is applied to the transactional view in the cache and appended to the CacheEvent list in the TransactionEvent object. + +## Event Conflation + +The cache events are conflated, so if a key already has an event in the list, that event is removed and the current operation is added to the end of the list. So this series of calls inside a transaction: + +``` pre + Region.create (A, W); + Region.put (A, valX); + Region.put (B, valQ); + Region.invalidate (A); + Region.put (A, valY); +``` + +results in these events stored in the CacheEvent list: + +``` pre + put (B, valQ) + put (A, valY) +``` + +# At commit and after commit + +When the transaction is committed, Geode passes the `TransactionEvent` to the transaction writer local to the transactional view, if one is available. After commit, Geode : + - Passes the `TransactionEvent` to each installed transaction listener. + - Walks the `CacheEvent` list, calling all locally installed listeners for each operation listed. + - Distributes the `TransactionEvent` to all interested caches. + **Note:** + For Geode and global JTA transactions, the `EntryEvent` object contains the Geode transaction ID. JTA transaction events do not contain the JTA transaction ID. + + http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/ccc2fbda/geode-docs/developing/transactions/transaction_jta_gemfire_example.html.md.erb ---------------------------------------------------------------------- diff --git a/geode-docs/developing/transactions/transaction_jta_gemfire_example.html.md.erb b/geode-docs/developing/transactions/transaction_jta_gemfire_example.html.md.erb new file mode 100644 index 0000000..6795158 --- /dev/null +++ b/geode-docs/developing/transactions/transaction_jta_gemfire_example.html.md.erb @@ -0,0 +1,31 @@ +--- +title: Geode JTA Transaction Example +--- + +An example code fragment shows how to run a JTA global transaction using Geode as the JTA transaction manager. + +The external data sources used in this transaction are configured in the `cache.xml` file. See [Configuring Database Connections Using JNDI](configuring_db_connections_using_JNDI.html#topic_A5E3A67C808D48C08E1F0DC167C5C494) for a configuration example. + +``` pre +Region r = ...; // the region data source +ds = ...; // other data source + + try { + Context ctx = cache.getJNDIContext(); + Connection conn = null; + UserTransaction tx = (UserTransaction) ctx.lookup("java:/UserTransaction"); + tx.begin(); + conn = ds.getConnection(); + Statement stmt = conn.createStatement(); + String sqlSTR = "insert into " + tableName + " values (........ )"; + stmt.executeUpdate(sqlSTR); + r.put("key", "value"); + stmt.close(); + tx.commit(); + conn.close(); + } catch (NamingException e) { + // handle the exception + } +``` + + http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/ccc2fbda/geode-docs/developing/transactions/transaction_semantics.html.md.erb ---------------------------------------------------------------------- diff --git a/geode-docs/developing/transactions/transaction_semantics.html.md.erb b/geode-docs/developing/transactions/transaction_semantics.html.md.erb new file mode 100644 index 0000000..58b3e47 --- /dev/null +++ b/geode-docs/developing/transactions/transaction_semantics.html.md.erb @@ -0,0 +1,37 @@ +--- +title: Geode Cache Transaction Semantics +--- + +Geode transaction semantics differ in some ways from the Atomicity-Consistency-Isolation-Durability (ACID) semantics of traditional relational databases. For performance reasons, Geode transactions do not adhere to ACID constraints by default, but can be configured for ACID support as described in this section. + +## Atomicity + +Atomicity is "all or nothing" behavior: a transaction completes successfully only when all of the operations it contains complete successfully. If problems occur during a transaction, perhaps due to other transactions with overlapping changes, the transaction cannot successfully complete until the problems are resolved. + +Geode transactions provide atomicity and realize speed by using a reservation system, instead of using the traditional relational database technique of a two-phase locking of rows. The reservation prevents other, intersecting transactions from completing, allowing the commit to check for conflicts and to reserve resources in an all-or-nothing fashion prior to making changes to the data. After all changes have been made, locally and remotely, the reservation is released. With the reservation system, an intersecting transaction is simply discarded. The serialization of obtaining locks is avoided. See [Committing Transactions](how_cache_transactions_work.html#concept_sbj_lj1_wk) for details on the two-phase commit protocol that implements the reservation system. + +## Consistency + +Consistency requires that data written within a transaction must observe the key and value constraints established for the affected region. Note that validity of the transaction is the responsibility of the application. + +## Isolation + +Isolation assures that operations will see either the pre-transaction state of the system or its post-transaction state, but not the transitional state that occurs while a transaction is in progress. Write operations in a transaction are always confirmed to ensure that stale values are not written. As a distributed cache-based system optimized for performance, Geode in its default configuration does not enforce read isolation. Geode transactions support repeatable read isolation, so once the committed value is read for a given key, it always returns that same value. If a transaction write, such as put or invalidate, deletes a value for a key that has already been read, subsequent reads return the transactional reference. + +In the default configuration, Geode isolates transactions at the process thread level, so while a transaction is in progress, its changes are visible only inside the thread that is running the transaction. Threads inside the same process and in other processes cannot see changes until after the commit operation begins. At this point, the changes are visible in the cache, but other threads that access the changing data might see only partial results of the transaction leading to a dirty read. + +If an application requires the slower conventional isolation model (such that dirty reads of transitional states are not allowed), read operations must be encapsulated within transactions and the `gemfire.detectReadConflicts` parameter must be set to 'true': + +`-Dgemfire.detectReadConflicts=true` + +This parameter causes read operations to succeed only when they read a consistent pre- or post-transactional state. If not, a `CommitConflictException` is thrown to the calling application. + +## Durability + +Relational databases provide durability by using disk storage for recovery and transaction logging. As a distributed cache-based system optimized for performance, Geode does not support on-disk or in-memory durability for transactions. + +Applications can emulate the conventional disk-based durability model by setting the `gemfire.ALLOW_PERSISTENT_TRANSACTIONS` parameter to 'true'. + +`-Dgemfire.ALLOW_PERSISTENT_TRANSACTIONS=true` + +This allows permanent regions to participate in transactions, thus providing disk-based durability. See [Transactions and Persistent Regions](cache_transactions_by_region_type.html#concept_omy_341_wk) for more detail on the use of this parameter. http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/ccc2fbda/geode-docs/developing/transactions/transaction_suspend_resume_example.html.md.erb ---------------------------------------------------------------------- diff --git a/geode-docs/developing/transactions/transaction_suspend_resume_example.html.md.erb b/geode-docs/developing/transactions/transaction_suspend_resume_example.html.md.erb new file mode 100644 index 0000000..40bc772 --- /dev/null +++ b/geode-docs/developing/transactions/transaction_suspend_resume_example.html.md.erb @@ -0,0 +1,21 @@ +--- +title: Basic Suspend and Resume Transaction Example +--- + +This example suspends and resumes a transaction. + +``` pre + CacheTransactionManager txMgr = cache.getCacheTransactionManager(); + + txMgr.begin(); + region.put("key1", "value"); + TransactionId txId = txMgr.suspend(); + assert region.containsKey("key1") == false; + // do other operations that should not be + // part of a transaction + txMgr.resume(txId); + region.put("key2", "value"); + txMgr.commit(); +``` + + http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/ccc2fbda/geode-docs/developing/transactions/transactional_and_nontransactional_ops.html.md.erb ---------------------------------------------------------------------- diff --git a/geode-docs/developing/transactions/transactional_and_nontransactional_ops.html.md.erb b/geode-docs/developing/transactions/transactional_and_nontransactional_ops.html.md.erb new file mode 100644 index 0000000..c2dd84b --- /dev/null +++ b/geode-docs/developing/transactions/transactional_and_nontransactional_ops.html.md.erb @@ -0,0 +1,100 @@ +--- +title: Comparing Transactional and Non-Transactional Operations +--- + + +Between the begin operation and the commit or rollback operation are a series of ordinary Geode operations. When they are launched from within a transaction, the Geode operations can be classified into two types: + +- Transactional operations affect the transactional view +- Non-transactional operations do not affect the transactional view + +An operation that acts directly on the cache does not usually act on the transactional view. + +- **[Transactional Operations](#transactional_operations)** + +- **[Non-Transactional Operations](#non_transactional_operations)** + +- **[Entry Operations](#entry_operations)** + +- **[Region Operations](#region_operations)** + +- **[Cache Operations](#cache_operations)** + +- **[No-Ops](#no-ops)** + +## Transactional Operations + +The `CacheTransactionManager` methods are the only ones used specifically for cache operations. Otherwise, you use the same methods as usual. Most methods that run within a transaction affect the transactional view, and they do not change the cache until the transaction commits. Methods that behave this way are considered transactional operations. Transactional operations are classified in two ways: whether they modify the transactional view or the cache itself, and whether they create write conflicts with other transactions. + +In general, methods that create, destroy, invalidate, update, or read region entries are transactional operations. + +Transactional operations that can cause write conflicts are those that modify an entry, such as put, a load done to satisfy a get operation, create, delete, local delete, invalidate and local invalidate. + +Transactional read operations do not cause conflicts directly, but they can modify the transactional view. Read operations look for the entry in the transaction view first and then, if necessary, go to the cache. If the entry is returned by a cache read, it is stored as part of the transactional view. At commit time, the transaction uses the initial snapshot of the entry in the view to discover write conflicts. + +## Non-Transactional Operations + +A few methods, when invoked within a transaction, have no effect on the transactional view, but they have an immediate effect on the cache. They are considered non-transactional operations. Often, non-transactional operations are administrative, such as `Region.destroy` and `Region.invalidate`. These operations are not supported within a transaction. If you call them, the system throws an exception of type `UnsupportedOperationInTransactionException`. + +## Entry Operations + +**Note:** +Transactional entry operations can be rolled back. + +| Operations | Methods | Transactional | Write Conflict | +|--------------------------------------|----------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------|----------------| +| create | `Region.create, put, putAll, Map.put, putAll` | yes | yes | +| modify | `Region.put, putAll, Map.put, putAll, Region.Entry.setValue, Map.Entry.setValue` | yes | yes | +| load | `Region.get, Map.get` | yes | yes | +| creation or update using `netSearch` | `Region.get, Map.get` | yes | no | +| destroy: local and distributed | `Region.localDestroy, destroy, remove, Map.remove` | yes | yes | +| invalidate: local and distributed | `Region.localInvalidate, invalidate` | yes | yes | +| set user attribute | `Region.Entry.setUserAttribute` | yes | yes | +| read of a single entry | `Region.get, getEntry, containsKey, containsValue, containsValueForKey` | yes | no | +| read of a collection of entries | `Region.keySet, entrySet, values` | Becomes transactional when you access the keys or values within the collection. | no | + +Some transactional write operations also do a read before they write, and these can complete a transactional read even when the write fails. The following table of entry operations notes the conditions under which this can happen. + +**Note:** +These operations can add a snapshot of an entry to the transaction's view even when the write operation does not succeed. + +| Operations | Methods | Reads Without Writing | +|-----------------------------------|--------------------------------------|---------------------------------------------------------------------------| +| create | `Region.create` | when it throws an `EntryExistsException` | +| destroy: local and distributed | `Region.localDestroy, destroy` | when it throws an `EntryNotFoundException` | +| invalidate: local and distributed | `Region.localInvalidate, invalidate` | when it throws an `EntryNotFoundException`or the entry is already invalid | + +## Region Operations + +When you create a region in a transaction, any data from the getInitialImage operation goes directly into the cache, rather than waiting for the transaction to commit. + +| Operations | Methods | Affected | Write Conflict | +|-----------------------------------|--------------------------------------------------|-----------------------|----------------| +| destroy: local and distributed | `Region.localDestroyRegion, destroyRegion` | cache | yes | +| invalidate: local and distributed | `Region.localInvalidateRegion, invalidateRegion` | cache | yes | +| clear: local and distributed | `Region.localClear, clear, Map.clear` | cache and transaction | no | +| close | `Region.close` | cache | yes | +| mutate attribute | `Region.getAttributesMutator` methods | cache | no | +| set user attribute | `Region.setUserAttribute` | cache | no | + +## Cache Operations + +When you create a region in a transaction, any data from the getInitialImage operation goes directly into the cache, rather than waiting for the transaction to commit. + +| Operations | Methods | Affected State | Write Conflict | +|------------|----------------------------------|----------------|----------------| +| create | `createRegionFactory().create()` | committed | no | +| close | `close` | committed | yes | + +## No-Ops + +Any operation that has no effect in a non-transactional context remains a no-op in a transactional context. For example, if you do two `localInvalidate` operations in a row on the same region, the second `localInvalidate` is a no-op. No-op operations do not: + +- Cause a listener invocation +- Cause a distribution message to be sent to other members +- Cause a change to an entry +- Cause any conflict + +A no-op can do a transactional read. + + http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/ccc2fbda/geode-docs/developing/transactions/transactional_function_example.html.md.erb ---------------------------------------------------------------------- diff --git a/geode-docs/developing/transactions/transactional_function_example.html.md.erb b/geode-docs/developing/transactions/transactional_function_example.html.md.erb new file mode 100644 index 0000000..6539131 --- /dev/null +++ b/geode-docs/developing/transactions/transactional_function_example.html.md.erb @@ -0,0 +1,55 @@ +--- +title: Transaction Embedded within a Function Example +--- + +This example demonstrates a function that does transactional updates to Customer and Order regions. + + + +``` pre +/** + * This function does transactional updates to customer and order regions + */ +public class TransactionalFunction extends FunctionAdapter { + + private Random random = new Random(); + /* (non-Javadoc) + * @see org.apache.geode.cache.execute.FunctionAdapter#execute(org.apache.geode.cache.execute.FunctionContext) + */ + @Override + public void execute(FunctionContext context) { + RegionFunctionContext rfc = (RegionFunctionContext)context; + Region<CustomerId, String> custRegion = rfc.getDataSet(); + Region<OrderId, String> + orderRegion = custRegion.getRegionService().getRegion("order"); + + CacheTransactionManager + mgr = CacheFactory.getAnyInstance().getCacheTransactionManager(); + CustomerId custToUpdate = (CustomerId)rfc.getFilter().iterator().next(); + OrderId orderToUpdate = (OrderId)rfc.getArguments(); + System.out.println("Starting a transaction..."); + mgr.begin(); + int randomInt = random.nextInt(1000); + System.out.println("for customer region updating "+custToUpdate); + custRegion.put(custToUpdate, + "updatedCustomer_"+custToUpdate.getCustId()+"_"+randomInt); + System.out.println("for order region updating "+orderToUpdate); + orderRegion.put(orderToUpdate, + "newOrder_"+orderToUpdate.getOrderId()+"_"+randomInt); + mgr.commit(); + System.out.println("transaction completed"); + context.getResultSender().lastResult(Boolean.TRUE); + } + + /* (non-Javadoc) + * @see org.apache.geode.cache.execute.FunctionAdapter#getId() + */ + @Override + public String getId() { + return "TxFunction"; + } + +} +``` + + http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/ccc2fbda/geode-docs/developing/transactions/transactions_overview.html.md.erb ---------------------------------------------------------------------- diff --git a/geode-docs/developing/transactions/transactions_overview.html.md.erb b/geode-docs/developing/transactions/transactions_overview.html.md.erb new file mode 100644 index 0000000..bef97d7 --- /dev/null +++ b/geode-docs/developing/transactions/transactions_overview.html.md.erb @@ -0,0 +1,50 @@ +--- +title: Basic Transaction Example +--- + +This example operates on two replicated regions. It begins a transaction, updates one entry in each region, and commits the result. + + +If the commit fails, it will be due to a `CommitConflictException`, which implies that a concurrent access caused a change to one of the items operated on within this transaction. This code fragment catches the exception, and it repeats the transaction attempt until the commit succeeds. + +``` pre +Cache c = new CacheFactory().create(); + +Region<String, Integer> cash = c.createRegionFactory<String, Integer>() + .setDataPolicy(DataPolicy.REPLICATE) + .create("cash"); + +Region<String, Integer> trades = c.createRegionFactory<String, Integer>() + .setDataPolicy(DataPolicy.REPLICATE) + .create("trades"); + +CacheTransactionManager txmgr = c.getCacheTransactionManager(); +boolean commitConflict = false; +do { + try { + txmgr.begin(); + final String customer = "Customer1"; + final Integer purchase = Integer.valueOf(1000); + // Decrement cash + Integer cashBalance = cash.get(customer); + Integer newBalance = + Integer.valueOf((cashBalance != null ? cashBalance : 0) + - purchase); + cash.put(customer, newBalance); + // Increment trades + Integer tradeBalance = trades.get(customer); + newBalance = + Integer.valueOf((tradeBalance != null ? tradeBalance : 0) + + purchase); + + trades.put(customer, newBalance); + txmgr.commit(); + commitConflict = false; + } + catch (CommitConflictException conflict) { + commitConflict = true; + } +} while (commitConflict); +``` + + http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/ccc2fbda/geode-docs/developing/transactions/turning_off_jta.html.md.erb ---------------------------------------------------------------------- diff --git a/geode-docs/developing/transactions/turning_off_jta.html.md.erb b/geode-docs/developing/transactions/turning_off_jta.html.md.erb new file mode 100644 index 0000000..2ca75da --- /dev/null +++ b/geode-docs/developing/transactions/turning_off_jta.html.md.erb @@ -0,0 +1,23 @@ +--- +title: Turning Off JTA Transactions +--- + +You can configure regions to not participate in any JTA global transaction. + +The `ignore-jta` region attribute is a boolean that tells the cache to ignore any in-progress JTA transactions when performing cache operations. It is primarily used for cache loaders, cache writers, and cache listeners that need to perform non-transactional operations on a region, such as caching a result set. It is set per region, so some regions can participate in JTA transactions, while others avoid participating in them. This example sets the `ignore-jta` region attribute in the `cache.xml` file. + +cache.xml: + +``` pre +<region name="bridge_region"> + <region-attributes scope="local" ignore-jta="true" statistics-enabled="true"/> + <cache-writer> . . . </cache-writer> + </region-attributes> +</region> +``` + +API: + +Using the API, you can turn off JTA transactions using `RegionFactory` and its method `setIgnoreJTA(boolean)`. The current setting for a region can be fetched from a region's `RegionAttributes` by using the `getIgnoreJTA` method. + + http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/ccc2fbda/geode-docs/developing/transactions/working_with_transactions.html.md.erb ---------------------------------------------------------------------- diff --git a/geode-docs/developing/transactions/working_with_transactions.html.md.erb b/geode-docs/developing/transactions/working_with_transactions.html.md.erb new file mode 100644 index 0000000..6b30c66 --- /dev/null +++ b/geode-docs/developing/transactions/working_with_transactions.html.md.erb @@ -0,0 +1,212 @@ +--- +title: Working with Geode Cache Transactions +--- + + + +This section contains guidelines and additional information on working with Geode and its cache transactions. + +- **[Setting Global Copy on Read](#concept_vx2_gs4_5k)** + +- **[Making a Safe Change Within a Transaction Using CopyHelper.copy](#concept_fdr_wht_vk)** + +- **[Transactions and Functions](#concept_ihn_zmt_vk)** + +- **[Using Queries and Indexes with Transactions](#concept_ty1_vnt_vk)** + +- **[Collections and Region.Entry Instances in Transactions](#concept_ksh_twz_vk)** + +- **[Using Eviction and Expiration Operations](#concept_vyt_txz_vk)** + +- **[Transactions and Consistent Regions](#transactions_and_consistency)** + +- **[Suspending and Resuming Transactions](#concept_u5b_ryz_vk)** + +- **[Using Cache Writer and Cache Listener Plug-Ins](#concept_ysx_nf1_wk)** + +- **[Configuring Transaction Plug-In Event Handlers](#concept_ocw_vf1_wk)** + +- **[How Transaction Events Are Managed](transaction_event_management.html)** + +## Setting Global Copy on Read + +As many entry operations return a reference to the cache entry, copy-on-read avoids problems within a transaction setting. To enable global copy-on-read for all reads, modify the `cache.xml` file or use the corresponding Java API call. + +Using cache.xml: + +``` pre +<cache lock-lease="120" lock-timeout="60" search-timeout="300" copy-on-read="true"> +``` + +API: + +``` pre +Cache c = CacheFactory.getInstance(system); + c.setCopyOnRead(true); +``` + +The copy-on-read attribute and the operations affected by the attribute setting are discussed in detail in [Managing Data Entries](../../basic_config/data_entries_custom_classes/managing_data_entries.html). + +## Making a Safe Change Within a Transaction Using CopyHelper.copy + +If `copy-on-read` is *not* globally set, and the cache uses replicated regions, explicitly make copies of the cache objects that are to be modified within a transaction. The `CopyHelper.copy` method makes copies: + +``` pre +CacheTransactionManager cTxMgr = cache.getCacheTransactionManager(); +cTxMgr.begin(); +Object o = (StringBuffer) r.get("stringBuf"); +StringBuffer s = (StringBuffer) CopyHelper.copy(o); +s.append("Changes unseen before commit. Read Committed."); +r.put("stringBuf", s); +cTxMgr.commit(); +``` + +## Transactions and Functions + +You can run a function from inside a transaction and you can nest a transaction within a function, as long as your combination of functions and transactions does not result in nested transactions. See [Function Execution](../function_exec/chapter_overview.html) for more about functions. + +A single transaction may contain multiple functions. + +If you are suspending and resuming a transaction with multiple function calls, all functions in the transaction must execute on the same member. + +See [Transaction Embedded within a Function Example](transactional_function_example.html#concept_22331B3DBFAB4C0BA95EF103BFB71257) for an example. + +## Using Queries and Indexes with Transactions + +Queries and indexes reflect the cache contents and ignore the changes made by ongoing transactions. If you do a query from inside a transaction, the query does not reflect the changes made inside that transaction. + +## Collections and Region.Entry Instances in Transactions + +Collections and region entries used in a transaction must be created inside the transaction. After the transaction has completed, the application can no longer use any region entry or collection or associated iterator created within the transaction. An attempted use outside of the transaction will throw an `IllegalStateException` exception. + +Region collection operations include `Region.keySet`, `Region.entrySet`, and `Region.values`. You can create instances of `Region.Entry` through the `Region.getEntry` operation or by looking at the contents of the result returned by a `Region.entrySet` operation. + +## Using Eviction and Expiration Operations + +Entry expiration and LRU eviction affect the committed state. They are not part of a transaction, and therefore they cannot be rolled back. + +## About Eviction + +LRU eviction operations do not cause write conflicts with existing transactions, despite destroying or invalidating entries. LRU eviction is deferred on entries modified by the transaction until the commit completes. Because anything touched by the transaction has had its LRU clock reset, eviction of those entries is not likely to happen immediately after the commit. + +When a transaction commits its changes in a region with distributed scope, the operation can invoke eviction controllers in the remote caches, as well as in the local cache. + +## Configure Expiration + +Local expiration actions do not cause write conflicts, but distributed expiration can cause conflicts and prevent transactions from committing in the members receiving the distributed operation. + +- When you are using transactions on local, preloaded or empty regions, make expiration local if possible. For every instance of that region, configure an expiration action of local invalidate or local destroy. In a cache.xml declaration, use a line similar to this: + + ``` pre + <expiration-attributes timeout="60" action="local-invalidate" /> + ``` + + In regions modified by a transaction, local expiration is suspended. Expiration operations are batched and deferred per region until the transaction completes. Once cleanup starts, the manager processes pending expirations. Transactions that need to change the region wait until the expirations are complete. + +- With partitioned and replicated regions, you cannot use local expiration. When you are using distributed expiration, the expiration is not suspended during a transaction, and expiration operations distributed from another member can cause write conflicts. In replicated regions, you can avoid conflicts by setting up your distributed system this way: + - Choose an instance of the region to drive region-wide expiration. Use a replicated region, if there is one. + - Configure distributed expiration only in that region instance. The expiration action must be either invalidate or destroy. In a `cache.xml` file declaration, use a line similar to this: + + ``` pre + <expiration-attributes timeout="300" action="destroy" /> + ``` + + - Run the transactions from the member in which expiration is configured. + +## Transactions and Consistent Regions + +A transaction that modifies a region in which consistency checking is enabled generates all necessary version information for region updates when the transaction commits. + +If a transaction modifies a normal, preloaded or empty region, the transaction is first delegated to a Geode member that holds a replicate for the region. This behavior is similar to the transactional behavior for partitioned regions, where the partitioned region transaction is forwarded to a member that hosts the primary for the partitioned region update. + +The limitation for transactions with a normal, preloaded or empty region is that, when consistency checking is enabled, a transaction cannot perform a `localDestroy` or `localInvalidate` operation against the region. Geode throws an `UnsupportedOperationInTransactionException` exception in such cases. An application should use a `Destroy` or `Invalidate` operation in place of a `localDestroy` or `localInvalidate` when consistency checks are enabled. + +## Suspending and Resuming Transactions + +The Geode `CacheTransactionManager` API provides the ability to suspend and resume transactions with the `suspend` and `resume` methods. The ability to suspend and resume is useful when a thread must perform some operations that should not be part of the transaction before the transaction can complete. A complex use case of suspend and resume implements a transaction that spans clients in which only one client at a time will not be suspended. + +Once a transaction is suspended, it loses the transactional view of the cache. None of the operations done within the transaction are visible to the thread. Any operations that are performed by the thread while the transaction is suspended are not part of the transaction. + +When a transaction is resumed, the resuming thread assumes the transactional view. A transaction that is suspended on a member must be resumed on the same member. + +Before resuming a transaction, you may want to check if the transaction exists on the member and whether it is suspended. The `tryResume` method implements this check and resume as an atomic step. + +If the member with the primary copy of the data crashes, the transactional view associated with that data is lost. The secondary member for the data will not be able to resume any transactions suspended on the crashed member. You will need to take remedial steps to retry the transaction on a new primary copy of the data. + +If a suspended transaction is not touched for a period of time, Geode cleans it up automatically. By default, the timeout for a suspended transaction is 30 minutes and can be configured using the system property `gemfire.suspendedtxTimeout`. For example, `gemfire.suspendedtxTimeout=60` specifies a timeout of 60 minutes. + +See [Basic Suspend and Resume Transaction Example](transaction_suspend_resume_example.html) for a sample code fragment that suspends and resumes a transaction. + +## Using Cache Writer and Cache Listener Plug-Ins + +All standard Geode application plug-ins work with transactions. In addition, the transaction interface offers specialized plug-ins that support transactional operation. + +No direct interaction exists between client transactions and client application plug-ins. When a client runs a transaction, Geode calls the plug-ins that are installed on the transaction's server delegate and its server host. Client application plug-ins are not called for operations inside the transaction or for the transaction as a whole. When the transaction is committed, the changes to the server cache are sent to the client cache according to client interest registration. These events can result in calls to the client's `CacheListener`s, as with any other events received from the server. + +The `EntryEvent` that a callback receives has a unique Geode transaction ID, so the cache listener can associate each event, as it occurs, with a particular transaction. The transaction ID of an `EntryEvent` that is not part of a transaction is null to distinguish it from a transaction ID. + +- `CacheLoader`. When a cache loader is called by a transaction operation, values loaded by the cache loader may cause a write conflict when the transaction commits. +- `CacheWriter`. During a transaction, if a cache writer exists, its methods are invoked as usual for all operations, as the operations are called in the transactions. The `netWrite` operation is not used. The only cache writer used is the one in the member where the transactional data resides. +- `CacheListener`. The cache listener callbacks - local and remote - are triggered after the transaction commits. The system sends the conflated transaction events, in the order they were stored. + +For more information on writing cache event handlers, see [Implementing Cache Event Handlers](../events/implementing_cache_event_handlers.html). + +## Configuring Transaction Plug-In Event Handlers + +Geode has two types of transaction plug-ins: Transaction Writers and Transaction Listeners. You can optionally install one transaction writer and one or more transaction listeners per cache. + +Like JTA global transactions, you can use transaction plug-in event handlers to coordinate Geode cache transaction activity with an external data store. However, you typically use JTA global transactions when Geode is running as a peer data store with your external data stores. Transaction writers and listeners are typically used when Geode is acting as a front end cache to your backend database. + +**Note:** +You can also use transaction plug-in event handlers when running JTA global transactions. + +## TransactionWriter + +When you commit a transaction, if a transaction writer is installed in the cache where the data updates were performed, it is called. The writer can do whatever work you need, including aborting the transaction. + +The transaction writer is the last place that an application can rollback a transaction. If the transaction writer throws any exception, the transaction is rolled back. For example, you might use a transaction writer to update a backend data source before the Geode cache transaction completes the commit. If the backend data source update fails, the transaction writer implementation can throw a [TransactionWriterException](/releases/latest/javadoc/org/apache/geode/cache/TransactionWriterException.html) to veto the transaction. + +A typical usage scenario would be to use the transaction writer to prepare the commit on the external database. Then in a transaction listener, you can apply the commit on the database. + +## Transaction Listeners + +When the transaction ends, its thread calls the transaction listener to perform the appropriate follow-up for successful commits, failed commits, or voluntary rollbacks. The transaction that caused the listener to be called no longer exists by the time the listener code executes. + +Transaction listeners have access to the transactional view and thus are not affected by non-transactional update operations. `TransactionListener` methods cannot make transactional changes or cause a rollback. They can, however, start a new transaction. Multiple transactions on the same cache can cause concurrent invocation of `TransactionListener` methods, so implement methods that do the appropriate synchronization of the multiple threads for thread-safe operation. + +A transaction listener can preserve the result of a transaction, perhaps to compare with other transactions, or for reference in case of a failed commit. When a commit fails and the transaction ends, the application cannot just retry the transaction, but must build up the data again. For most applications, the most efficient action is just to start a new transaction and go back through the application logic again. + +The rollback and failed commit operations are local to the member where the transactional operations are run. When a successful commit writes to a distributed or partitioned region, however, the transaction results are distributed to other members the same as other updates. The transaction listener on the receiving members reflect the changes the transaction makes in that member, not the originating member. Any exceptions thrown by the transaction listener are caught by Geode and logged. + +To configure a transaction listener, add a `cache-transaction-manager` configuration to the cache definition and define one or more instances of `transaction-listener` there. The only parameter to this `transaction-listener` is `URL`, which must be a string, as shown in the following cache.xml example. + +**Note:** +The `cache-transaction-manager` allows listeners to be established. This attribute does not install a different transaction manager. + +Using cache.xml: + +``` pre +<cache search-timeout="60"> + <cache-transaction-manager> + <transaction-listener> + <class-name>com.company.data.MyTransactionListener</class-name> + <parameter name="URL"> + <string>jdbc:cloudscape:rmi:MyData</string> + </parameter> + </transaction-listener> + <transaction-listener> + . . . + </transaction-listener> + </cache-transaction-manager> + . . . + </cache> +``` + +Using the Java API: + +``` pre +CacheTransactionManager manager = cache.getCacheTransactionManager(); +manager.addListener(new LoggingTransactionListener()); +``` + + http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/ccc2fbda/geode-docs/getting_started/15_minute_quickstart_gfsh.html.md.erb ---------------------------------------------------------------------- diff --git a/geode-docs/getting_started/15_minute_quickstart_gfsh.html.md.erb b/geode-docs/getting_started/15_minute_quickstart_gfsh.html.md.erb new file mode 100644 index 0000000..6b8bff8 --- /dev/null +++ b/geode-docs/getting_started/15_minute_quickstart_gfsh.html.md.erb @@ -0,0 +1,499 @@ +--- +title: Apache Geode in 15 Minutes or Less +--- + + +Need a quick introduction to Apache Geode? Take this brief tour to try out basic features and functionality. + +## Step 1: Install Apache Geode. + +See [How to Install](installation/install_standalone.html#concept_0129F6A1D0EB42C4A3D24861AF2C5425) for instructions. + +## Step 2: Use gfsh to start a Locator. + +In a terminal window, use the `gfsh` command line interface to start up a locator. Apache Geode *gfsh* (pronounced "jee-fish") provides a single, intuitive command-line interface from which you can launch, manage, and monitor Apache Geode processes, data, and applications. See [gfsh (Geode SHell)](../tools_modules/gfsh/chapter_overview.html). + +The *locator* is a Geode process that tells new, connecting members where running members are located and provides load balancing for server use. A locator, by default, starts up a JMX Manager, which is used for monitoring and managing of a Geode cluster. The cluster configuration service uses locators to persist and distribute cluster configurations to cluster members. See [Running Geode Locator Processes](../configuring/running/running_the_locator.html) and [Overview of the Cluster Configuration Service](../configuring/cluster_config/gfsh_persist.html). + +1. Create a scratch working directory (for example, `my_gemfire`) and change directories into it. `gfsh` saves locator and server working directories and log files in this location. +2. Start gfsh by typing `gfsh` at the command line (or `gfsh.bat` if you are using Windows). + + ``` pre + _________________________ __ + / _____/ ______/ ______/ /____/ / + / / __/ /___ /_____ / _____ / + / /__/ / ____/ _____/ / / / / + /______/_/ /______/_/ /_/ v8.2.0 + + Monitor and Manage GemFire + gfsh> + ``` + +3. At the `gfsh` prompt, type: + + ``` pre + gfsh>start locator --name=locator1 + Starting a GemFire Locator in /home/username/my_gemfire/locator1... + ................................. + Locator in /home/username/my_gemfire/locator1 on ubuntu.local[10334] as locator1 is currently online. + Process ID: 3529 + Uptime: 18 seconds + GemFire Version: 8.2.0 + Java Version: 1.8.0_60 + Log File: /home/username/my_gemfire/locator1/locator1.log + JVM Arguments: -Dgemfire.enable-cluster-configuration=true -Dgemfire.load-cluster-configuration-from-dir=false + -Dgemfire.launcher.registerSignalHandlers=true -Djava.awt.headless=true + -Dsun.rmi.dgc.server.gcInterval=9223372036854775806 + Class-Path: /home/username/Pivotal_GemFire_820_b17919_Linux/lib/gemfire.jar: + /home/username/Pivotal_GemFire_820_b17919_Linux/lib/locator-dependencies.jar + + Successfully connected to: [host=ubuntu.local, port=1099] + + Cluster configuration service is up and running. + ``` + +## Step 3. Start Pulse. + +Start up the browser-based Pulse monitoring tool. Pulse is a Web Application that provides a graphical dashboard for monitoring vital, real-time health and performance of Geode clusters, members, and regions. See [Geode Pulse](../tools_modules/pulse/chapter_overview.html). + +``` pre +gfsh>start pulse +``` + +This command launches Pulse and automatically connects you to the JMX Manager running in the Locator. At the Pulse login screen, type in the default username `admin` and password `admin`. + +The Pulse application now displays the locator you just started (locator1): + + + +## Step 4: Start a server. + +A Geode server is a process that runs as a long-lived, configurable member of a cluster (also called a *distributed system*). The Geode server is used primarily for hosting long-lived data regions and for running standard Geode processes such as the server in a client/server configuration. See [Running Geode Server Processes](../configuring/running/running_the_cacheserver.html). + +Start the cache server: + +``` pre +gfsh>start server --name=server1 --server-port=40411 + +``` + +This commands starts a cache server named "server1" on the specified port of 40411. + +Observe the changes (new member and server) in Pulse. Try expanding the distributed system icon to see the locator and cache server graphically. + +## Step 5: Create a replicated, persistent region. + +In this step you create a region with the `gfsh` command line utility. Regions are the core building blocks of the Geode cluster and provide the means for organizing your data. The region you create for this exercise employs replication to replicate data across members of the cluster and utilizes persistence to save the data to disk. See [Data Regions](../basic_config/data_regions/chapter_overview.html#data_regions). + +1. Create a replicated, persistent region: + + ``` pre + gfsh>create region --name=regionA --type=REPLICATE_PERSISTENT + Member | Status + ------- | -------------------------------------- + server1 | Region "/regionA" created on "server1" + ``` + + Note that the region is hosted on server1. + +2. Use the `gfsh` command line to view a list of the regions in the cluster. + + ``` pre + gfsh>list regions + List of regions + --------------- + regionA + ``` + +3. List the members of your cluster. The locator and cache servers you started appear in the list: + + ``` pre + gfsh>list members + Name | Id + -------- | --------------------------------------- + locator1 | ubuntu(locator1:3529:locator)<v0>:59926 + server1 | ubuntu(server1:3883)<v1>:65390 + ``` + +4. To view specifics about a region, type the following: + + ``` pre + gfsh>describe region --name=regionA + .......................................................... + Name : regionA + Data Policy : persistent replicate + Hosting Members : server1 + + Non-Default Attributes Shared By Hosting Members + + Type | Name | Value + ------ | ---- | ----- + Region | size | 0 + ``` + +5. In Pulse, click the green cluster icon to see all the new members and new regions that you just added to your cluster. + +**Note:** Keep this `gfsh` prompt open for the next steps. + +## Step 6: Manipulate data in the region and demonstrate persistence. + +Apache Geode manages data as key/value pairs. In most applications, a Java program adds, deletes and modifies stored data. You can also use gfsh commands to add and retrieve data. See [Data Commands](../tools_modules/gfsh/quick_ref_commands_by_area.html#topic_C7DB8A800D6244AE8FF3ADDCF139DCE4). + +1. Run the following `put` commands to add some data to the region: + + ``` pre + gfsh>put --region=regionA --key="1" --value="one" + Result : true + Key Class : java.lang.String + Key : 1 + Value Class : java.lang.String + Old Value : <NULL> + + + gfsh>put --region=regionA --key="2" --value="two" + Result : true + Key Class : java.lang.String + Key : 2 + Value Class : java.lang.String + Old Value : <NULL> + ``` + +2. Run the following command to retrieve data from the region: + + ``` pre + gfsh>query --query="select * from /regionA" + + Result : true + startCount : 0 + endCount : 20 + Rows : 2 + + Result + ------ + two + one + ``` + + Note that the result displays the values for the two data entries you created with the `put` commands. + + See [Data Entries](../basic_config/data_entries_custom_classes/chapter_overview.html). + +3. Stop the cache server using the following command: + + ``` pre + gfsh>stop server --name=server1 + Stopping Cache Server running in /home/username/my_gemfire/server1 on ubuntu.local[40411] as server1... + Process ID: 3883 + Log File: /home/username/my_gemfire/server1/server1.log + .... + ``` + +4. Restart the cache server using the following command: + + ``` pre + gfsh>start server --name=server1 --server-port=40411 + ``` + +5. Run the following command to retrieve data from the region again-- notice that the data is still available: + + ``` pre + gfsh>query --query="select * from /regionA" + + Result : true + startCount : 0 + endCount : 20 + Rows : 2 + + Result + ------ + two + one + ``` + + Because regionA uses persistence, it writes a copy of the data to disk. When a server hosting regionA starts, the data is populated into the cache. Note that the result displays the values for the two data entries you created prior to stopping the server with the `put` commands. + + See [Data Entries](../basic_config/data_entries_custom_classes/chapter_overview.html). + + See [Data Regions](../basic_config/data_regions/chapter_overview.html#data_regions). + +## Step 7: Examine the effects of replication. + +In this step, you start a second cache server. Because regionA is replicated, the data will be available on any server hosting the region. + +See [Data Regions](../basic_config/data_regions/chapter_overview.html#data_regions). + +1. Start a second cache server: + + ``` pre + gfsh>start server --name=server2 --server-port=40412 + ``` + +2. Run the `describe region` command to view information about regionA: + + ``` pre + gfsh>describe region --name=regionA + .......................................................... + Name : regionA + Data Policy : persistent replicate + Hosting Members : server1 + server2 + + Non-Default Attributes Shared By Hosting Members + + Type | Name | Value + ------ | ---- | ----- + Region | size | 2 + ``` + + Note that you do not need to create regionA again for server2. The output of the command shows that regionA is hosted on both server1 and server2. When gfsh starts a server, it requests the configuration from the cluster configuration service which then distributes the shared configuration to any new servers joining the cluster. + +3. Add a third data entry: + + ``` pre + gfsh>put --region=regionA --key="3" --value="three" + Result : true + Key Class : java.lang.String + Key : 3 + Value Class : java.lang.String + Old Value : <NULL> + ``` + +4. Open the Pulse application (in a Web browser) and observe the cluster topology. You should see a locator with two attached servers. Click the Data tab to view information about regionA. +5. Stop the first cache server with the following command: + + ``` pre + gfsh>stop server --name=server1 + Stopping Cache Server running in /home/username/my_gemfire/server1 on ubuntu.local[40411] as server1... + Process ID: 4064 + Log File: /home/username/my_gemfire/server1/server1.log + .... + ``` + +6. Retrieve data from the remaining cache server. + + ``` pre + gfsh>query --query="select * from /regionA" + + Result : true + startCount : 0 + endCount : 20 + Rows : 3 + + Result + ------ + two + one + three + ``` + + Note that the data contains 3 entries, including the entry you just added. + +7. Add a fourth data entry: + + ``` pre + gfsh>put --region=regionA --key="4" --value="four" + Result : true + Key Class : java.lang.String + Key : 3 + Value Class : java.lang.String + Old Value : <NULL> + ``` + + Note that only server2 is running. Because the data is replicated and persisted, all of the data is still available. But the new data entry is currently only available on server 2. + + ``` pre + gfsh>describe region --name=regionA + .......................................................... + Name : regionA + Data Policy : persistent replicate + Hosting Members : server2 + + Non-Default Attributes Shared By Hosting Members + + Type | Name | Value + ------ | ---- | ----- + Region | size | 4 + ``` + +8. Stop the remaining cache server: + + ``` pre + gfsh>stop server --name=server2 + Stopping Cache Server running in /home/username/my_gemfire/server2 on ubuntu.local[40412] as server2... + Process ID: 4185 + Log File: /home/username/my_gemfire/server2/server2.log + ..... + ``` + +## Step 8: Restart the cache servers in parallel. + +In this step you restart the cache servers in parallel. Because the data is persisted, the data is available when the servers restart. Because the data is replicated, you must start the servers in parallel so that they can synchronize their data before starting. + +1. Start server1. Because regionA is replicated and persistent, it needs data from the other server to start and waits for the server to start: + + ``` pre + gfsh>start server --name=server1 --server-port=40411 + Starting a GemFire Server in /home/username/my_gemfire/server1... + ............................................................................ + ............................................................................ + ``` + + Note that if you look in the server1.log file for the restarted server, you will see a log message similar to the following: + + ``` pre + [info 2015/01/14 09:08:13.610 PST server1 <main> tid=0x1] Region /regionA has pot + entially stale data. It is waiting for another member to recover the latest data. + My persistent id: + + DiskStore ID: 8e2d99a9-4725-47e6-800d-28a26e1d59b1 + Name: server1 + Location: /192.0.2.0:/home/username/my_gemfire/server1/. + + Members with potentially new data: + [ + DiskStore ID: 2e91b003-8954-43f9-8ba9-3c5b0cdd4dfa + Name: server2 + Location: /192.0.2.0:/home/username/my_gemfire/server2/. + ] + Use the "gemfire list-missing-disk-stores" command to see all disk stores that + are being waited on by other members. + ``` + +2. In a second terminal window, change directories to the scratch working directory (for example, `my_gemfire`) and start gfsh: + + ``` pre + [username@localhost ~/my_gemfire]$ gfsh + _________________________ __ + / _____/ ______/ ______/ /____/ / + / / __/ /___ /_____ / _____ / + / /__/ / ____/ _____/ / / / / + /______/_/ /______/_/ /_/ v8.2.0 + + Monitor and Manage GemFire + ``` + +3. Run the following command to connect to the cluster: + + ``` pre + gfsh>connect --locator=localhost[10334] + Connecting to Locator at [host=localhost, port=10334] .. + Connecting to Manager at [host=ubuntu.local, port=1099] .. + Successfully connected to: [host=ubuntu.local, port=1099] + ``` + +4. Start server2: + + ``` pre + gfsh>start server --name=server2 --server-port=40412 + ``` + + When server2 starts, note that **server1 completes its start up** in the first gfsh window: + + ``` pre + Server in /home/username/my_gemfire/server1 on ubuntu.local[40411] as server1 is currently online. + Process ID: 3402 + Uptime: 1 minute 46 seconds + GemFire Version: 8.2.0 + Java Version: 1.8.0_60 + Log File: /home/username/my_gemfire/server1/server1.log + JVM Arguments: -Dgemfire.default.locators=192.0.2.0[10334] -Dgemfire.use-cluster-configuration=true + -XX:OnOutOfMemoryError=kill -KILL %p -Dgemfire.launcher.registerSignalHandlers=true + -Djava.awt.headless=true -Dsun.rmi.dgc.server.gcInterval=9223372036854775806 + Class-Path: /home/username/Pivotal_GemFire_820_b17919_Linux/lib/gemfire.jar: + /home/username/Pivotal_GemFire_820_b17919_Linux/lib/server-dependencies.jar + ``` + +5. Verify that the locator and two servers are running: + + ``` pre + gfsh>list members + Name | Id + -------- | --------------------------------------- + server2 | ubuntu(server2:3992)<v8>:21507 + server1 | ubuntu(server1:3402)<v7>:36532 + locator1 | ubuntu(locator1:2813:locator)<v0>:46644 + ``` + +6. Run a query to verify that all the data you entered with the `put` commands is available: + + ``` pre + gfsh>query --query="select * from /regionA" + + Result : true + startCount : 0 + endCount : 20 + Rows : 5 + + Result + ------ + one + two + four + Three + + NEXT_STEP_NAME : END + ``` + +7. Stop server2 with the following command: + + ``` pre + gfsh>stop server --dir=server2 + Stopping Cache Server running in /home/username/my_gemfire/server2 on 192.0.2.0[40412] as server2... + Process ID: 3992 + Log File: /home/username/my_gemfire/server2/server2.log + .... + ``` + +8. Run a query to verify that all the data you entered with the `put` commands is still available: + + ``` pre + gfsh>query --query="select * from /regionA" + + Result : true + startCount : 0 + endCount : 20 + Rows : 5 + + Result + ------ + one + two + four + Three + + NEXT_STEP_NAME : END + ``` + +## Step 9: Shut down the system including your locators. + +To shut down your cluster, do the following: + +1. In the current `gfsh` session, stop the cluster: + + ``` pre + gfsh>shutdown --include-locators=true + ``` + + See [shutdown](../tools_modules/gfsh/command-pages/shutdown.html). + +2. When prompted, type 'Y' to confirm the shutdown of the cluster. + + ``` pre + As a lot of data in memory will be lost, including possibly events in queues, + do you really want to shutdown the entire distributed system? (Y/n): Y + Shutdown is triggered + + gfsh> + No longer connected to ubuntu.local[1099]. + gfsh> + ``` + +3. Type `exit` to quit the gfsh shell. + +## Step 10: What to do next... + +Here are some suggestions on what to explore next with Apache Geode: + +- Continue reading the next section to learn more about the components and concepts that were just introduced. +- To get more practice using `gfsh`, see [Tutorial—Performing Common Tasks with gfsh](../tools_modules/gfsh/tour_of_gfsh.html#concept_0B7DE9DEC1524ED0897C144EE1B83A34). +- To learn about the cluster configuration service, see [Tutorial—Creating and Using a Cluster Configuration](../configuring/cluster_config/persisting_configurations.html#task_bt3_z1v_dl).
|View raw message


text:
Product Description
This unique new Cercis is exclusively available to the European gardener in February 2018 from Treetyme. Carolina Sweetheart originated as a result of breeding at the NCSU by Dr Tom Ranney and is a 'Forest Pansy' x 'Silver Cloud' cross. Pink flowers appear in the spring followed by an array of different coloured and variegated leaves. A truly eye stopping plant.
To receive this plant reservations will have to be made with payment by September 2017 and the limited supply will be sold on a first come basis.

subset: commoncrawl


text:
Welcome to the Board of Directors and Committee Chairs page. You are invited to contact Board Members with your ideas or to volunteer your time for a most rewarding experience of serving on the Board or committee. Contact by email is available through the Contacts page or through the member database in the member's only page.
Committee Chairs
|Dominic LoTempio, CPSM
|Professional Placement
|Fred Vigars
|Nominations & Elections
|Martha Switzer, CPSM
|Community Charities
|Dave Gardner
|Business Survey
|Dr. Randy Cragun
|Gamble Award
|Debbie Pusateri
|Mike Lovelace, C.P.M.
|Kurt Keller
|Reception House
|Jon Desing
|Plant Tours
|Bob Kostran
|Nancy Boyd Haley
|Public Relations
|Nancy Boyd Haley
|Table Top Displays
|Nancy Boyd Haley
|Mike Lovelace, C.P.M.


text:
My word for 2016 is viriditas, but my theme seems to be contemplation. This was the focus of the encaustic… Read more Contemplation
Tag: contemplation
The art of pondering
I lost it again, my focus. I lose it about every 5 minutes, too often for comfort. I blame my addiction… Read more The art of pondering
Ringing in the New Year
I've really enjoyed this break from school and have spent much time in my art studio working on surprises for… Read more Ringing in the New Year


text: John Stax was the bass player for The Pretty Things, an influential rhythm 'n' blues band in England formed in the 60's (which is still going today). He is the owner of Black Diamond Cigar Box Guitars. He is the coolest and the most talented man I know. He is my Dad.


text:
Raid, Sail & Plunder With Pirate Den By Gamesmith
March 10, 2014 by brennon
A while ago Warren, Sam and I talked with the producer of Tabletop Boyan Radakovich about gaming and now he has taken to Kickstarter alongside Richard James and Todd Harris with Pirate Den which looks to be an awesome game of piratical thinking, looting, stealing and buried treasure.
The game is for 3-5 players and sees you taking on the role of pirate captains during the golden age of piracy. Each turn you will be hedging your bets on how much loot to steal, whether it's from the table or each other, and then working out if you want to hold onto it and push your luck further or bury your hard earned loot but step back from the pilfering for a turn!
The artwork is awesome and brings together a fantastic world of over the top piracy that seems to suit the game and it's theme well. The back and forth nature of the game, plenty of laughs and bluffs and the overall social aspect of the game means that I think it all gels together nicely.
If you'd like to know more about the game then you can check out a Critical Preview of the game above which plays through the game and shows how all the mechanics work. I think this looks like an awesome project and another one of those light 'take that' style tabletop games that make gaming sessions a lot of fun.
The Kickstarter launches soon so keep an eye out for the full launch.
Do you feel piratical?
Supported by
Supported by


text:
Art in Alternative Spaces
Power Center Photography © David Solzman
Chicago Photography © David Solzman
Stormy Lake Michigan Photography © David Solzman
Dusk - Chicago Photography © David Solzman
David Solzman has spent his life celebrating, studying and photographing both natural and human environments as he produces images of great intensify and sensitivity that depict not only nature itself, but also the city within nature - a melding of the natural and artificial world. Solzman participated in CITY 2000 and his work was shown in City 2000 exhibitions at Gallery 312, The Chicago Gallery (old water tower) Chicago Art Expo, The Chicago Historical Society, and in the final exhibit at the Chicago Cultural Center. Solzman has mounted one-man shows at the University of Chicago, the Cliff Dwellers Club, and several libraries and other cultural venues in the Chicago area. In addition, this body of work has been exhibited for sale at local galleries and art fairs including the 57th Street Fair, the Wells Street Fair, the New East Side Artworks, the Port Clinton Fair, and many other fairs throughout the Chicagoland area where they have received honors and purchase awards. Solzman studied photography with Sam Abel of the National Geographic and with Arthur Meyerson and his photography evolved during the thirty-five years he served as a professor of urban geography at the University of Illinois at Chicago. Currently, twenty-six of Solzman's images form an exhibit touring Chicago under auspices of the Chicago Sister Cities International Program. Sister Cities presented a similar exhibit to tour Osaka Japan. Solzman's work has appeared in Chicago magazine, Where, and in Midwest Living, and thousands have had the opportunity to enjoy his images in calendars focused on the Chicago area. His photographs have illustrated articles in the scholarly journal Popular Culture published at the University of Chicago along with scholarly and popular books on the Chicago area. His recent book, The Chicago River, published in 1998, features 85 of his images. He produced the cover image for the blues album of the year 1997, Call Me, and his Chicago skyline poster "Power Center" has been a best seller for many years. David Solzman's images are included in the collections of major corporations including Amoco, Deloitte & Touche, Nation's Bank, South Shore Bank, Geosyntec, and many others. Currently, seventy of Solzman's images grace the website of Chicago's famed Museum of Science and Industry, and Mayor Richard J. Daley presented one of Solzman's photographs to the Mayor of Osaka, Japan when he came to Chicago to dedicate the refurbished Japanese garden in Jackson Park. Solzman's most recent work includes major projects on Lake Michigan and on highly abstract images taken in industrial areas. Solzman's developing work continues to celebrate the beauty of the world and to serve as a reminder of the interdependence of the human and natural worlds.
© 2017 Anatomically Correct. No text or photograph contained in the pages of this website may be reproduced without the expressed written permission of the artist and/or Anatomically Correct.


text:
Part of TopicBrowse Topic in full-screen mode
Statistics253 reads
Combination Therapies: Quantifying the Effects of Transarterial Embolization on Microwave Ablation Zones
Erica M. Knavel, M.D., Christopher L. Brace, Ph.D., Paul F. Laeseke M.D., Ph.D.
There is increasing interest in combining transarterial embolization (TAE) and thermal ablation for treating large, poorly visualized, or infiltrative hepatocellular carcinomas.
Improved oncologic outcomes are demonstrated when compared with either therapy alone with several retrospective studies demonstrating improved overall survival (OS), improved recurrence-free survival and decreased rate of disease progression with combination therapy (TACE combined with MW or RF ablation) compared to ablation alone for the treatment of HCC.1-6
No data exists regarding the effect of transarterial embolization on the size, shape and reproducibility of subsequent microwave ablations.
The purpose of this study is to quantify the effect of TAE on microwave ablations in an in vivo porcine liver model.
Methods & Materials:
Femoral arterial approach arteriograms and cone beam CT scans were performed to delineate hepatic arterial anatomy and identify individual branches supplying each of the four liver lobes in 6 female domestic swine.
Two of the four liver lobes were embolized to near stasis (5 beat stasis) with 100-300μm Embosphere® Microspheres (Merit Medical Systems, Inc., South Jordan, UT).
Microwave ablations (65 W, 5 min) were created in both embolized (TAE-MW, n=15) and non-embolized (MW, n= 12) portions of the liver using a 2.45 GHz system and single antenna (Certus 140 and PR-15, NeuWave Medical, Inc., Madison WI).
A mixed effects model was used to compare the TAE-MW and MW groups.
Performing TAE prior to microwave ablation increases ablation zone diameter and area by approximately 27% and 66%, respectively.
This size increase is due to an increase in the size of the peripheral portion of the ablation zone, which is most susceptible to perfusion mediated cooling and heat sinks.
Further studies are warranted to characterize the effect of particle size, timing of the embolization, and different microwave power/time combinations on the resultant ablation zones.
1. Ni JY, Liu SS, Xu LF, Sun HL, Chen YT. Meta-analysis of radiofrequency ablation in combination with transarterial chemoembolization for hepatocellular carcinoma. World J Gastroenterol. 2013;19(24):3872-82.
2. Peng ZW, Zhang YJ, Chen MS, Xu L, Liang HH, Lin XJ, Guo RP, Zhang YQ, Lau WY. Radiofrequency ablation with or without transcatheter arterial chemoembolization in the treatment of hepatocellular carcinoma: a prospective randomized trial. J Clin Oncol. 2013;31(4):426-32.
3. Yang WZ, Jiang N, Huang N, Huang JY, Zheng QB, Shen Q. Combined therapy with transcatheter arterial chemoembolization and percutaneous microwave coagulation for small hepatocellular carcinoma. World J Gastroenterol. 2009;15(6):748-52.
4. Seki T, Tamai T, Nakagawa T, Imamura M, Nishimura A, Yamashiki N, Ikeda K, Inoue K. Combination therapy with transcatheter arterial chemoembolization and percutaneous microwave coagulation therapy for hepatocellular carcinoma. Cancer. 2000;89(6):1245-51.
5. Li W, Man W, Guo H, Yang P. Clinical study of transcatheter arterial chemoembolization combined with microwave ablation in the treatment of advanced hepatocellular carcinoma. J Cancer Res Ther. 2016;12(Supplement):C217-C20.
6. Ginsburg M, Zivin SP, Wroblewski K, Doshi T, Vasnani RJ, Van Ha TG. Comparison of Combination Therapies in the Management of Hepatocellular Carcinoma: Transarterial Chemoembolization with Radiofrequency Ablation versus Microwave Ablation. J Vasc Interv Radiol. 2015;26(3):330-41.


text:
NIWA is a leading environmental and natural resource science institute and key provider of atmospheric, freshwater and marine research and consultancy services in New Zealand.
We have an exciting opportunity for an experienced engineer to make a significant contribution to the New Zealand (NZ) research landscape by working within the National eScience Infrastructure (NeSI).
The New Zealand eScience Infrastructure (htltps://www.nesi.org.nz/) is a collaboration of five institutions, including the National Institute of Water and Atmospheric Research (NIWA), working in partnership with the Crown, to provide High Performance Computing (HPC), analytics, and consultancy services to the NZ Research sector, and industry. NeSI's primary aim is to grow the computing and analytics capability of researchers to ensure New Zealand's future prosperity.
A key component of NIWA's research infrastructure is the High Performance Computing Facility (HPCF) (http://www.niwa.co.nz/our-services/hpcf), which is used to support research activities in climate, chemistry climate, weather, river flood, sea state, ocean, sea-level, and inundation modelling and forecasting, as well as an operational environmental forecasting system (EcoConnect). Within the National eScience Infrastructure (https://www.nesi.org.nz/) the system also supports the High Performance Computing (HPC) requirements of researchers within the national research community.
We are seeking a Systems Engineer for our HPCF Operations Group, part of the NeSI (national) Platforms Service. In this role you will provide systems support to operational and science users. Daily monitoring and maintenance of systems, servers, storage and services, for correct functionality and optimum performance are key responsibilities of this position. There will also be an opportunity to help us extend and enhance OpenStack deployments from the bare metal.
We are looking for an operations expert with a few years of experience in Cluster management and operating Openstack environment who also has:
- a tertiary qualification in computer science and/or other sciences, and equivalent work experience in System Administration, Development, IT Operations / DevOps.
- a solid understanding of Linux / UNIX preferably in HPC service, datacentre, or cloud computing environment.
- parallel filesystem knowledge (GPFS, Spectrum Scale, Spectrum Scale Protect).
- strong scripting skills; we love to automate! Provisioning systems, configuration and change management (Python, Ansible, Puppet)
- an understanding of networking fundamentals and protocols (Including InfiniBand).
You are a team player, excellent at troubleshooting, root cause analysis and generally love to solve technical problems. You will have strong communication skills both written and verbal and be able to articulate technical and non-technical concepts. You will also be passionate about technology and committed to continuously improving.
NIWA offers competitive remuneration and benefits, an attractive waterfront location with free parking and the opportunity to work in a collaborative, national, and professional team.
A job description, online applications and further information about NIWA can be found at https://careers.sciencenewzealand.org/niwa/niwa-jobs
Applications close 2 July 2017


text:
Looking for job opportunity in Japan (Tokyo)
Dear all,
my name is Tobias Gries and I recently graduated from the East Asia Institute in Germany (BSc in International Business Management East Asia - Japan; Business Administration & Japanese studies).
Currently, I am living my 7th year in Japan, while doing an internship at Bosch (Automotive Aftermarket, Marketing). Unfortunately, my contract will end on the 29th of February and therefore I am looking for a job opportunity in an international company in Japan.
I am especially interested in the field of Marketing and would be pleased about any Tips, company names or contacts.
Thank you very much in advance and have a nice Sunday.


text:
MIAMI — They made it look like innocent fun, this brutal sport of helmets and shoulder pads and broken bones. They used to plow across the green field of the Orange Bowl with the happy abandon of kids on a weekend romp. Maybe that`s why they`re still so special after all these years, why we remember them and smile.
Their last names were all you ever needed to know: Csonka and Kiick. They were a team within a team, a pair of wild cards in the Miami Dolphins` deck. They were perfectly suited for pro football, and every Sunday they showed a raw, unblinking courage that inspired fans and players alike.