Skip to content

db

@Transactionalで例外発生時にロールバックされる条件

@Transactionalを付与したメソッド内で例外が発生しても、Springにその例外が伝わらなければRollbackされない。 より具体的には、「@Transactionalを付与したメソッド」を呼び出す「プロキシオブジェクト」に例外が伝わらなければRollbackされない。

// insert()でのDB更新はRollbackされない
// try-catch内で例外がもみ消されメソッドは正常終了し、Spring(プロキシオブジェクト)に例外が伝播されないため
@Transactional
public static void noRollback(){
    try{
        insert(); // DB更新
        hoge(); //このメソッドで例外発生するとする
    } catch(Exception e) {
        System.out.println("例外発生");
    }
}
// Spring(プロキシオブジェクト)に例外がスローされるため、insert()でのDB更新はRollbackされる
@Transactional
public static void yesRollback(){
    try{
        insert(); // DB更新
        hoge(); //このメソッドで例外発生するとする
    } catch(Exception e) {
        throw e;
    }
}