春4.3の非トランザクションメソッドから@Transactionalメソッドを呼び出します

sergクンツ:

私は、次のコードを持っています:

@Service
public class ItemService {
    ...

    public void addItems(@Nonnull DocumentDTO dto) throws Exception {
        // some code that takes some time to process
        ...

        addItems(dto.getDocId(), items);
    }

    @Transactional
    public void addItems(long docId, @Nonnull List<Item> items) {
        itemDao.addItems(docId, items);
    }
}

最初の方法は@Transactionalではありません、それは@Transactionalを有する第二1を呼び出します。@Transactional「値『』の方法は、互換性のない同じクラスのメソッドを呼び出してはいけません」というSonarLintツールの状態(https://rules.sonarsource.com/java/RSPEC-2229

しかし、このコードは、春4.3.20で正しく動作します。この規則は、春4.3.20の実際のですか?

PSの興味深い、私はパッケージプライベートとして第2の方法を行った場合、SonarLint警告が消える...なぜ?

ケンちゃん

しかし、このコードは、春4.3.20で正しく動作します。この規則は、春4.3.20の実際のですか?

はい。SonarLintは正しいです。自己呼び出しは作ることができない@Transactionalを有効にします。これは、(参照春AOPがどのように働くかであることも、春5に変更されませんドキュメント)。あなたのコードは、おそらくあなたは別のトランザクションの内部を開始するために動作itemDaoします(別のしているかもしれませ@TransactionalにマークItemDao#addItems())。

私はパッケージプライベートとして第二の方法を作る場合、SonarLintの警告は消え...なぜ?

なぜ知ってはいけません。多分それはバグです。この中で述べたように、ルール、それは時にマーク警告与える必要@Transactionalプライベートメソッドインチ

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=197743&siteId=1