<?xml version="1.0" encoding="UTF-8"?>
<!--
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements.  See the NOTICE file
 distributed with this work for additional information
 regarding copyright ownership.  The ASF licenses this file
 to you under the Apache License, Version 2.0 (the
 "License"); you may not use this file except in compliance
 with the License.  You may obtain a copy of the License at

 http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing,
 software distributed under the License is distributed on an
 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
-->
<chapter id="jpa_overview_trans">
    <title>
        Transaction
    </title>
    <indexterm zone="jpa_overview_trans">
        <primary>
            transactions
        </primary>
        <seealso>
            Transaction
        </seealso>
    </indexterm>
    <para>
Transactions are critical to maintaining data integrity. They are used to group
operations into units of work that act in an all-or-nothing fashion.
Transactions have the following qualities:
    </para>
    <itemizedlist>
        <listitem>
            <para>
            <indexterm>
                <primary>
                    atomicity
                </primary>
                <seealso>
                    transactions
                </seealso>
            </indexterm>
            <indexterm>
                <primary>
                    transactions
                </primary>
                <secondary>
                    atomicity
                </secondary>
            </indexterm>
<emphasis>Atomicity</emphasis>. Atomicity refers to the all-or-nothing property
of transactions. Either every data update in the transaction completes
successfully, or they all fail, leaving the datastore in its original state. A
transaction cannot be only partially successful.
            </para>
        </listitem>
        <listitem>
            <para>
            <indexterm>
                <primary>
                    consistency
                </primary>
                <seealso>
                    transactions
                </seealso>
            </indexterm>
            <indexterm>
                <primary>
                    transactions
                </primary>
                <secondary>
                    consistency
                </secondary>
            </indexterm>
<emphasis>Consistency</emphasis>. Each transaction takes the datastore from one
consistent state to another consistent state.
            </para>
        </listitem>
        <listitem>
            <para>
            <indexterm>
                <primary>
                    isolation
                </primary>
                <seealso>
                    transactions
                </seealso>
            </indexterm>
            <indexterm>
                <primary>
                    transactions
                </primary>
                <secondary>
                    isolation
                </secondary>
            </indexterm>
<emphasis>Isolation</emphasis>. Transactions are isolated from each other. When
you are reading persistent data in one transaction, you cannot "see" the changes
that are being made to that data in other transactions. Similarly, the updates
you make in one transaction cannot conflict with updates made in concurrent
transactions. The form of conflict resolution employed depends on whether you
are using pessimistic or optimistic transactions. Both types are described later
in this chapter.
            </para>
        </listitem>
        <listitem>
            <para>
            <indexterm>
                <primary>
                    durability
                </primary>
                <seealso>
                    transactions
                </seealso>
            </indexterm>
            <indexterm>
                <primary>
                    transactions
                </primary>
                <secondary>
                    durability
                </secondary>
            </indexterm>
<emphasis>Durability</emphasis>. The effects of successful transactions are
durable; the updates made to persistent data last for the lifetime of the
datastore.
            </para>
        </listitem>
    </itemizedlist>
    <para>
    <indexterm>
        <primary>
            ACID
        </primary>
        <seealso>
            transactions
        </seealso>
    </indexterm>
    <indexterm>
        <primary>
            transactions
        </primary>
        <secondary>
            ACID
        </secondary>
    </indexterm>
Together, these qualities are called the ACID properties of transactions. To
understand why these properties are so important to maintaining data integrity,
consider the following example:
    </para>
    <para>
Suppose you create an application to manage bank accounts. The application
includes a method to transfer funds from one user to another, and it looks
something like this:
    </para>
<programlisting>
public void transferFunds(User from, User to, double amnt) {
    from.decrementAccount(amnt);
    to.incrementAccount(amnt);
}
</programlisting>
    <para>
Now suppose that user Alice wants to transfer 100 dollars to user Bob. No
problem; you simply invoke your <methodname>transferFunds</methodname> method,
supplying Alice in the <literal>from</literal> parameter, Bob in the <literal>
to</literal> parameter, and <literal>100.00</literal> as the <literal>amnt
</literal>. The first line of the method is executed, and 100 dollars is
subtracted from Alice's account. But then, something goes wrong. An unexpected
exception occurs, or the hardware fails, and your method never completes.
    </para>
    <para>
You are left with a situation in which the 100 dollars has simply disappeared.
Thanks to the first line of your method, it is no longer in Alice's account, and
yet it was never transferred to Bob's account either. The datastore is in an
inconsistent state.
    </para>
    <para>
The importance of transactions should now be clear. If the two lines of the
<methodname>transferFunds</methodname> method had been placed together in a
transaction, it would be impossible for only the first line to succeed. Either
the funds would be transferred properly or they would not be transferred at all,
and an exception would be thrown. Money could never vanish into thin air, and
the data store could never get into an inconsistent state.
    </para>
    <section id="jpa_overview_trans_types">
        <title>
            Transaction Types
        </title>
        <indexterm zone="jpa_overview_trans_types">
            <primary>
                transactions
            </primary>
            <secondary>
                types
            </secondary>
        </indexterm>
        <para>
There are two major types of transactions: pessimistic transactions and
optimistic transactions. Each type has both advantages and disadvantages.
        </para>
        <para>
        <indexterm>
            <primary>
                transactions
            </primary>
            <secondary>
                pessimistic
            </secondary>
        </indexterm>
        <indexterm>
            <primary>
                pessimistic transactions
            </primary>
            <see>
                transactions, pessimistic
            </see>
        </indexterm>
        <indexterm>
            <primary>
                deadlock
            </primary>
            <seealso>
                transactions
            </seealso>
        </indexterm>
Pessimistic transactions generally lock the datastore records they act on,
preventing other concurrent transactions from using the same data. This avoids
conflicts between transactions, but consumes database resources. Additionally,
locking records can result in <emphasis>deadlock</emphasis>, a situation in
which two transactions are both waiting for the other to release its locks
before completing. The results of a deadlock are datastore-dependent; usually
one transaction is forcefully rolled back after some specified timeout interval,
and an exception is thrown.
        </para>
        <para>
        <indexterm>
            <primary>
                transactions
            </primary>
            <secondary>
                datastore
            </secondary>
        </indexterm>
        <indexterm>
            <primary>
                datastore transactions
            </primary>
            <see>
                transactions, datastore
            </see>
        </indexterm>
This document will often use the term <emphasis>datastore</emphasis> transaction
in place of <emphasis>pessimistic</emphasis> transaction. This is to acknowledge
that some datastores do not support pessimistic semantics, and that the exact
meaning of a non-optimistic JPA transaction is dependent on the datastore. Most
of the time, a datastore transaction is equivalent to a pessimistic transaction.
        </para>
        <para>
        <indexterm>
            <primary>
                transactions
            </primary>
            <secondary>
                optimistic
            </secondary>
        </indexterm>
        <indexterm>
            <primary>
                optimistic transactions
            </primary>
            <see>
                transactions, optimistic
            </see>
        </indexterm>
Optimistic transactions consume less resources than pessimistic/datastore
transactions, but only at the expense of reliability. Because optimistic
transactions do not lock datastore records, two transactions might change the
same persistent information at the same time, and the conflict will not be
detected until the second transaction attempts to flush or commit. At this time,
the second transaction will realize that another transaction has concurrently
modified the same records (usually through a timestamp or versioning system),
and will throw an appropriate exception. Note that optimistic transactions still
maintain data integrity; they are simply more likely to fail in heavily
concurrent situations.
        </para>
        <para>
Despite their drawbacks, optimistic transactions are the best choice for most
applications. They offer better performance, better scalability, and lower risk
of hanging due to deadlock.
        </para>
        <note>
            <para>
OpenJPA uses optimistic semantics by default, but supports both optimistic and
datastore transactions. OpenJPA also offers advanced locking and versioning APIs
for fine-grained control over database resource allocation and object
versioning. See <xref linkend="ref_guide_locking"/> of the Reference Guide for
details on locking. <xref linkend="jpa_overview_meta_version"/>
of this document covers standard object versioning, while
<xref linkend="ref_guide_mapping_jpa"/> of the Reference Guide discusses
additional versioning strategies available in OpenJPA.
            </para>
        </note>
    </section>
    <section id="jpa_overview_trans_local">
        <title>
            The EntityTransaction Interface
        </title>
        <indexterm zone="jpa_overview_trans_local">
            <primary>
                Transaction
            </primary>
            <seealso>
                transactions
            </seealso>
        </indexterm>
        <mediaobject>
            <imageobject>
                <!-- PNG image data, 193 x 157 (see README) -->
                <imagedata fileref="img/jpa-transaction.png" width="129px"/>

            </imageobject>
        </mediaobject>
        <para>
JPA integrates with your container's <emphasis>managed</emphasis> transactions,
allowing you to use the container's declarative transaction demarcation and its
Java Transaction API (JTA) implementation for transaction management. Outside of
a container, though, you must demarcate transactions manually through JPA. The
<classname>EntityTransaction</classname> interface controls unmanaged
transactions in JPA.
        </para>
<programlisting>
public void begin();
public void commit();
public void rollback();
</programlisting>
        <para>
        <indexterm>
            <primary>
                Transaction
            </primary>
            <secondary>
                demarcation
            </secondary>
        </indexterm>
        <indexterm>
            <primary>
                transactions
            </primary>
            <secondary>
                demarcating
            </secondary>
        </indexterm>
        <indexterm>
            <primary>
                Transaction
            </primary>
            <secondary>
                begin
            </secondary>
        </indexterm>
        <indexterm>
            <primary>
                Transaction
            </primary>
            <secondary>
                commit
            </secondary>
        </indexterm>
        <indexterm>
            <primary>
                Transaction
            </primary>
            <secondary>
                rollback
            </secondary>
        </indexterm>
The <methodname>begin</methodname>, <methodname>commit</methodname>, and
<methodname>rollback</methodname> methods demarcate transaction boundaries. The
methods should be self-explanatory: <methodname>begin</methodname> starts a
transaction, <methodname>commit</methodname> attempts to commit the
transaction's changes to the datastore, and <methodname>rollback</methodname>
aborts the transaction, in which case the datastore is "rolled back" to its
previous state. JPA implementations will automatically roll back transactions if
any exception is thrown during the commit process.
        </para>
        <para>
Unless you are using an extended persistence context, committing or rolling back
also ends the persistence context. All managed entities will be detached from the
<classname>EntityManager</classname>.
        </para>
<programlisting>
public boolean isActive();
</programlisting>
        <para>
        <indexterm>
            <primary>
                Transaction
            </primary>
            <secondary>
                isActive
            </secondary>
        </indexterm>
Finally, the <methodname>isActive</methodname> method returns <literal>true
</literal> if the transaction is in progress (<methodname>begin</methodname>
has been called more recently than <methodname>commit</methodname> or
<methodname>rollback</methodname>), and <literal>false</literal> otherwise.
        </para>
        <example id="jpa_overview_trans_group">
            <title>
                Grouping Operations with Transactions
            </title>
<programlisting>
public void transferFunds(EntityManager em, User from, User to, double amnt) {
    // note: it would be better practice to move the transaction demarcation
    // code out of this method, but for the purposes of example...
    Transaction trans = em.getTransaction();
    trans.begin();
    try
    {
        from.decrementAccount(amnt);
        to.incrementAccount(amnt);
        trans.commit();
    }
    catch (RuntimeException re)
    {
        if (trans.isActive())
            trans.rollback();   // or could attempt to fix error and retry
        throw re;
    }
}
</programlisting>
        </example>
    </section>
</chapter>
