前提
対象技術: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);
}
}
上記のように、実際に呼び出している実装クラスで、親クラスの実装を直接呼び出すようにすることで、
トランザクションを有効にすることができます。