トランザクション¶
以下は Spring の PlatformTransactionManager を使った手動トランザクション制御のサンプルコード です。
✅ 手動トランザクション制御のサンプル(Java / Spring)¶
@Service
public class SampleService {
public void executeProcess() {
// ---------------------------
// 1. トランザクション定義
// ---------------------------
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setName(PROGRAM_ID);
def.setReadOnly(false);
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
// ---------------------------
// 2. トランザクション開始
// ---------------------------
TransactionStatus status = platformTransactionManager.getTransaction(def);
try {
// ---------------------------
// DB 更新処理
// ---------------------------
// repository.update(...);
// repository.insert(...);
// ---------------------------
// 3. コミット
// ---------------------------
platformTransactionManager.commit(status);
} catch (Exception e) {
// ---------------------------
// 4. ロールバック
// ---------------------------
if (!status.isCompleted()) {
platformTransactionManager.rollback(status);
}
// スタックトレース
outputStackTrace(e);
// ログ or 再スロー
throw e;
}
}
}
✅ 説明¶
① DefaultTransactionDefinition¶
トランザクション名・読み取り専用・伝播レベルを指定。
② getTransaction¶
Spring に 手動でトランザクション開始 を依頼する。
③ commit¶
正常終了したら commit。
④ rollback¶
例外が出たら rollback。
※ status.isCompleted() を見るのは 二重ロールバックを防ぐため。
🔥 ポイント¶
-
PlatformTransactionManagerを直接使う場合は 必ず try-catch で囲む -
@Transactionalと違って、例外で自動ロールバックされない -
commitとrollbackは両方書く必要あり