概要
Domaは、ローカルトランザクションをサポートします。このドキュメントでは、ローカルトランザクションの設定方法と利用方法について説明します。
グローバルトランザクションを使用したい場合は、JTA(Java Transaction API)の実装をもつフレームワークやアプリケーションサーバーの機能を利用してください。
ローカルトランザクションのサンプルはチュートリアルを、 JTAを使ったグローバルトランザクションのサンプルはDoma JPetStoreを参照ください。
設定方法
ローカルトランザクションを有効にするには、データソースとしてLocalTransactionalDataSourceを使用します。
このクラスのインスタンスは設定クラスでシングルトンとして管理し、getDataSource()メソッドで外部に返すようにしてください。
LocalTransactionalDataSourceのgetLocalTransaction(JdbcLogger)メソッドは、LocalTransactionを生成して返します。
このクラスのインスタンスがローカルトランザクションを表します。
このインスタンスを外部へ返すためのメソッドを設定クラスに作成してください。
ローカルトランザクションに対応した設定クラスの例は以下のとおりです。
public class AppConfig extends DomaAbstractConfig {
protected static final LocalTransactionalDataSource dataSource = createDataSource();
protected static final Dialect dialect = new HsqldbDialect();
@Override
public DataSource getDataSource() {
return dataSource;
}
@Override
public Dialect getDialect() {
return dialect;
}
protected static LocalTransactionalDataSource createDataSource() {
SimpleDataSource dataSource = new SimpleDataSource();
dataSource.setUrl("jdbc:hsqldb:mem:tutorial");
dataSource.setUser("sa");
return new LocalTransactionalDataSource(dataSource);
}
public static LocalTransaction getLocalTransaction() {
return dataSource.getLocalTransaction(defaultJdbcLogger);
}
}
利用方法
設定クラスをDaoインタフェースに以下のように注釈するとして例を示します。
@Dao(config = AppConfig.class)
public interface EmployeeDao {
...
}
ローカルトランザクションの開始と終了
設定クラスからLocalTransactionalを取得し、トランザクションをbegin()で開始し、commit()またはrollback()でトランザクションを終了します。
LocalTransaction tx = AppConfig.getLocalTransaction();
try {
// 開始
tx.begin();
Employee employee = dao.selectById(1);
employee.setName("hoge");
employee.setJobType(JobType.PRESIDENT);
dao.update(employee);
// コミット
tx.commit();
} finally {
// ロールバック
tx.rollback();
}
次のように記述することもできます。
try {
// 開始
AppConfig.getLocalTransaction().begin();
Employee employee = dao.selectById(1);
employee.setName("hoge");
employee.setJobType(JobType.PRESIDENT);
dao.update(employee);
// コミット
AppConfig.getLocalTransaction().commit();
} finally {
// ロールバック
AppConfig.getLocalTransaction().rollback();
}
begin()で開始されたトランザクションは、必ずcommit()またはrollback()で終了しなければいけません。
LocalTransactionalDataSourceを利用するデータアクセスは、例外なく必ずローカルトランザクションの中で実行しなければいけません。
トランザクションはトランザクション分離レベルを指定して開始することができます。
LocalTransaction tx = AppConfig.getLocalTransaction();
try {
tx.begin(TransactionIsolationLevel.SERIALIZABLE);
...
tx.commit();
} finally {
tx.rollback();
}
セーブポイント
セーブポイントを使用することで、トランザクション中の特定の変更を取り消すことができます。
LocalTransaction tx = AppConfig.getLocalTransaction();
try {
tx.begin();
// 検索して更新
Employee employee = dao.selectById(1);
employee.setName("hoge");
dao.update(employee);
// セーブポイントを作成
tx.setSavepoint("beforeDelete");
// 削除
dao.delete(employee);
// セーブポイントへ戻る(上で行った削除を取り消す)
tx.rollback("beforeDelete");
tx.commit();
} finally {
tx.rollback();
}
