次のコードが機能しない理由がわかりません。新しいトランザクションをループで開始する(propagation = REQUIRES_NEW)。そして、このトランザクションで新しいトランザクションが発生する前に、すべてのトランザクションをコミットする必要があります。ただし、ループの最初の反復のみが実行され、その後は何も起こりません。ループ内で新しいトランザクション(REQUIRES_NEWを使用)の伝播が期待通りに機能していない
@Service
@Transactional
public class Aimpl implements A {
@Autowired
private B b;
private Logger logger = LoggerFactory.getLogger(this.getClass());
public void methodA(List<Customer> customers){
logger.info("before loop"); //gets printed
customers.forEach(customer -> {
logger.info("1"); //--> this gets printed
b.processEachCustomer(customer);
logger.info("2"); //- this does not get printed
});
logger.info("after loop"); //does not get printed
}
}
//-----------------Second class----------
@Service
@Transactional
public class Bimpl implements B {
@Autowired
private MyRepository repository;
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void processEachCustomer(Customer customer){
//process each customer - a new transaction everytime
//and it should be committed independently
repository.updateCustomerData(customer.getId());
logger.info("3");//this does not get printed
}
}
これは、1つの行のテーブルで更新クエリを発行するリポジトリクラスです。
public interface MyRepository extends Repository<Customer , Long> {
@Modifying
@Query("UPDATE Customer c SET c.status = 1 WHERE i.id= :id")
int setStatusById(@Param("id") Integer id);
}
私はここで間違っていますか?基本的に、なぜループの最初の反復のみが動作し、残りは実行されませんか?私はそれをデバッグしようとしており、アプリケーションが最初の反復後にブレークポイントで停止するのを見ません。
「実行がかなり停止する」とはどういう意味ですか? – galovics
最初の反復後に何も起こりません。私はそれをデバッグしようとしており、ブレークポイントで停止することはなく、何も起こっていないことを示すログメッセージはありません。 – Righto
ログメッセージをループの内側とループの前後に置くとどうなりますか?コンソールには何が書かれていますか? – galovics