94 lines
4.2 KiB
XML
94 lines
4.2 KiB
XML
<?xml version="1.0" encoding="UTF-8"?>
|
|
<!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd">
|
|
<section>
|
|
<title>Transactions in Spring Data Graph</title>
|
|
<para>
|
|
Neo4j is a transactional datastore which only allows modifications within transaction boundaries and fullfills
|
|
the ACID properties. Reading from the store is also possible outside of transactions.
|
|
</para>
|
|
|
|
<para>Spring Data Graph integrates with transaction managers configured using Spring. The simplest scenario of
|
|
just running the graph database uses a SpringTransactionManager provided by the Neo4j kernel to be used
|
|
with Spring's JtaTransactionManager.
|
|
|
|
Note: The explicit XML configuration given below is encoded in the <code>Neo4jConfiguration</code>
|
|
configuration bean that uses Spring's @Configuration functioanlity. This simplifies the configuration.
|
|
An example is shown further below.
|
|
</para>
|
|
<programlisting language="xml"><![CDATA[
|
|
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
|
|
<property name="transactionManager">
|
|
<bean class="org.neo4j.kernel.impl.transaction.SpringTransactionManager">
|
|
<constructor-arg ref="graphDatabaseService"/>
|
|
</bean>
|
|
</property>
|
|
<property name="userTransaction">
|
|
<bean class="org.neo4j.kernel.impl.transaction.UserTransactionImpl">
|
|
<constructor-arg ref="graphDatabaseService"/>
|
|
</bean>
|
|
</property>
|
|
</bean>
|
|
|
|
<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/>
|
|
]]></programlisting>
|
|
<para>
|
|
For scenarios running multiple transactional resources there are two options.
|
|
First of all you can have Neo4j participate in the externally set up transaction manager using the new
|
|
SpringProvider by enabling the configuration parameter for your graph database. Either via the spring config
|
|
or the configuration file (neo4j.properties).
|
|
</para>
|
|
<programlisting language="xml"><![CDATA[
|
|
<context:annotation-config />
|
|
<context:spring-configured/>
|
|
|
|
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
|
|
<property name="transactionManager">
|
|
<bean id="jotm" class="org.springframework.data.graph.neo4j.transaction.JotmFactoryBean"/>
|
|
</property>
|
|
</bean>
|
|
|
|
<bean class="org.neo4j.kernel.EmbeddedGraphDatabase" destroy-method="shutdown">
|
|
<constructor-arg value="target/test-db"/>
|
|
<constructor-arg>
|
|
<map>
|
|
<entry key="tx_manager_impl" value="spring-jta"/>
|
|
</map>
|
|
</constructor-arg>
|
|
</bean>
|
|
|
|
<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/>
|
|
]]></programlisting>
|
|
<para>
|
|
You can configure a stock XA transaction manager to be used with Neo4j and the other resources (e.g. Atomikos,
|
|
JOTM, App-Server-TM). For a bit less secure but fast 1 phase commit best effort, use the implementation coming
|
|
with Spring Data Graph (<code>ChainedTransactionManager</code>). It takes a list of transaction-managers as
|
|
constructor params and will handle them in order for transaction start and commit (or rollback) in the reverse
|
|
order.
|
|
</para>
|
|
<programlisting language="xml"><![CDATA[
|
|
<bean id="transactionManager"
|
|
class="org.springframework.data.graph.neo4j.transaction.ChainedTransactionManager" >
|
|
<constructor-arg>
|
|
<list>
|
|
<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="jpaTransactionManager">
|
|
<property name="entityManagerFactory" ref="entityManagerFactory"/>
|
|
</bean>
|
|
<bean
|
|
class="org.springframework.transaction.jta.JtaTransactionManager">
|
|
<property name="transactionManager">
|
|
<bean class="org.neo4j.kernel.impl.transaction.SpringTransactionManager">
|
|
<constructor-arg ref="graphDatabaseService" />
|
|
</bean>
|
|
</property>
|
|
<property name="userTransaction">
|
|
<bean class="org.neo4j.kernel.impl.transaction.UserTransactionImpl">
|
|
<constructor-arg ref="graphDatabaseService" />
|
|
</bean>
|
|
</property>
|
|
</bean>
|
|
</list>
|
|
</constructor-arg>
|
|
</bean>
|
|
]]></programlisting>
|
|
</section>
|