1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Java(Spring)_子クラスでトランザクション管理が効かない場合の対処法

Posted at

前提

対象技術:Java(Spring)

以前、Java(Spring)のシステムでトランザクションが効かないという問題が発生しました。
その問題の内容と、問題を解決した方法について紹介をさせていただきます。

発生した問題

java
@Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)
public class SamplDetailServiceImpl extends SamplServiceImpl {

    public Foo getFoo(String fooName) {
        // do something
    }
}

上記のような、ServiceImplを継承したSamplDetailServiceImplクラスが、呼び出し元のクラスパス内に存在する想定で

java
@Autowired
private SamplService samplService;

samplService.registerFooList(fooList);

上記のように実行をした場合に、
親クラスのSamplServiceImplで実装されているregisterFooListメソッドでトランザクションが効かないという問題です。

ちなみに親クラスの実装は、

java
public class SamplServiceImpl implements SamplService {

    public void registerFooList(List<Foo> fooList) {
        // do something
    }
}

上記のような実装を想定します。

解決方法

原因は、実際に呼び出している実装クラスで「直接呼び出されていないメソッド」を呼び出した場合、
トランザクションが効かないという事象が発生してしまいます。

そこで、SamplDetailServiceImplの実装クラスを

java
@Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)
public class SamplDetailServiceImpl extends SamplServiceImpl {

    public Foo getFoo(String fooName) {
        // do something
    }
    
    @Override
    public void registerFooList(List<Foo> fooList) {
        super().registerFooList(fooList);
    }

}

上記のように、実際に呼び出している実装クラスで、親クラスの実装を直接呼び出すようにすることで、
トランザクションを有効にすることができます。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?