Help us understand the problem. What is going on with this article?

[Spring] 明示的トランザクション

More than 3 years have passed since last update.

Springのトランザクションを明示的に管理にする方法についてメモ。

Springのトランザクション管理の中心となるインターフェイス

[PlatformTransactionManager]
PlatformTransactionManagerはトランザクション管理に必要なAPIを提供しており、
APIを呼び出すことでトランザクション操作を実行できます。
また、PlatformTransactionManagerはトランザクション管理の実装を抽象化するための
インターフェイスであるため、異なる種類のトランザクションを、種類の違いを意識をすることなく
同一のAPIで操作することができます。
(SpringはTransactionTemplateを推奨)

PlatformTransactionManagerの実装クラス

クラス名 説明
DataSourceTransactionManager JDBCおよびMyBatisなどのJDBCベースのライブラリによるデータベースアクセスを行う場合に使用する
HibernateTransactionManager Hibernateによるデータベースアクセスを行う場合に利用する

トランザクションマネージャーの定義

  1. PlatformTransactionManagerのBean定義
  2. トランザクション対象とするメソッドを定義

ローカルトランザクションを利用する場合

ローカルトランザクションを使用する場合は、JDBCのAPIを呼び出してトランザクション制御を行う
DataSourceTransactionを使用します。
ローカルトランザクションとは、単一のデータストアに対するトランザクションのことで、
一般的によく使われるトランザクションです。
例えば、単一のデータベースに対する複数の操作を1つの論理的な単位で処理したい場合に使われます。

XMLによるBean定義
<!-- BeanIDには"transactionManager"を指定するのがオススメ -->
<!-- Springのデフォルトとして、トランザクションのBeanIDを"transactionManager"としているため -->
<bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>
<!-- @Transactionアノテーションを利用する場合 -->
<tx:annotation-driven>

明示的トランザクション

プログラム的トランザクションとは、コミットやロールバックといったトランザクション制御に関する処理を
ソールコードに明示的に記述する方法のこと。
メソッド単位より細かい粒度でトランザクション制御を行いたい場合などに有効。

トランザクションの分離レベル

トランザクションの分離レベルには、参照するデータや変更したデータを他のトランザクションと
どのように分離するかを指定します。
分離レベルは、複数トランザクションの同時実行とデータの一貫性に関係します。

トランザクション分離レベル 説明
DEFAULT 利用するデータベースのデフォルトの分離レベル
READ_UNCOMMITTED ダーティリード、ノンリピータブルリード、ファントムリードが発生する
READ_COMMITTED ダーティリードを防止するが、ノンリピータブルリード、ファントムリードは発生する
REPEATABLE_READ ダーティリード、ノンリピータブルリードを防止するが、ファントムリードは発生する
SERIALIZABLE ダーティリード、ノンリピータブルリード、ファントムリードを防止する

トランザクション伝播レベル

トランザクションの伝播レベルには、トランザクション境界でトランザクション参加する方法を指定します。
指定する値によって、「新たにトランザクションを開始するもの」
「すでに開始されているトランザクションに相乗りするもの」などがあります。

トランザクション境界と伝播レベル

※後ほど記載

Springで利用可能なトランザクション伝播レベル

伝播レベル 説明
REQUIRED 現在のトランザクションを継続して利用する。もしその時点でトランザクションが存在しない場合、トランザクションを新規に作成し、開始する
REQUIRED_NEW 必ず新規のトランザクションを作成し、開始する。もしその時点でトランザクションがすでに存在している場合、新規のトランザクションがするまでの開いた、現在のトランザクションを一時的に停止する
MANDATORY 現在のトランザクションを継続して利用する。もしその時点でトランザクションが存在しない場合は、例外が発生する
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした