Chapter 11. Transactions And Concurrency

Chapter 11. Transactions And Concurrency

11.1. Session and transaction scopes
11.1.1. Unit of work
11.1.2. Long conversations
11.1.3. Considering object identity
11.1.4. Common issues
11.2. Database transaction demarcation
11.2.1. Non-managed environment
11.2.2. Using JTA
11.2.3. Exception handling
11.2.4. Transaction timeout
11.3. Optimistic concurrency control
11.3.1. Application version checking
11.3.2. Extended session and automatic versioning
11.3.3. Detached objects and automatic versioning
11.3.4. Customizing automatic versioning
11.4. Pessimistic Locking
11.5. Connection Release Modes

The most important point about Hibernate and concurrency control is that it is very easy to understand. Hibernate directly uses JDBC connections and JTA resources without adding any additional locking behavior. We highly recommend you spend some time with the JDBC, ANSI, and transaction isolation specification of your database management system.

Hibernate does not lock objects in memory. Your application can expect the behavior as defined by the isolation level of your database transactions. Note that thanks to the Session, which is also a transaction-scoped cache, Hibernate provides repeatable reads for lookup by identifier and entity queries (not reporting queries that return scalar values).

In addition to versioning for automatic optimistic concurrency control, Hibernate also offers a (minor) API for pessimistic locking of rows, using the SELECT FOR UPDATE syntax. Optimistic concurrency control and this API are discussed later in this chapter.

We start the discussion of concurrency control in Hibernate with the granularity of Configuration, SessionFactory, and Session, as well as database transactions and long conversations.