0

@Transactional アノテーションを使用したトランザクションのロールバックで問題に直面しています。

backingbean、service、および dao クラスに次のメソッドがあります。

public class ItemBackingBean {
    public void saveUpdate() {
        try {
            ItemService.executeTransaction();
        }
        catch(Exception e) {
        }
    }
}

public class ItemService {
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void executeTransaction() {
        deleteItem();
        createOrder();
    }

    private void deleteItem() {
        persist();
    }

    private void createOrder() {
        persist();
    }

    private void persist() {
        JpaDaoImpl.persist(object);
        JpaDaoImpl.update(object);
    }
}

public class JpaDaoImpl implements JpaDao {
    @Transactional(readOnly = true)
    public persist(Object object) {
        getEm().persist(object);
    }

    @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
    public void update(Object object) {
        getEm().merge(object);
    }

    @Transactional(readOnly = true)
    public void remove(Object object) {
        getEm().remove(object);
    }
}

createOrder() で何らかの例外が発生した場合、すべてのトランザクションはロールバックされるはずですが、発生していません。誰でも問題を教えてもらえますか?

JpaDaoImpl.java での @Transactional の影響は何ですか? persist() メソッドと update() メソッドの radOnly 値は異なります。この Dao はプロジェクトの既存のコードであり、変更したくありません。誰でも助けることができますか?

よろしく、バンドゥ

4

2 に答える 2

-1

createOrder() で何らかの例外が発生した場合、すべてのトランザクションはロールバックされるはずですが、発生していません。誰でも問題を教えてもらえますか?

ロールバックは RuntimeExceptions に対してのみ発生します ( http://docs.spring.io/spring/docs/2.0.8/reference/transaction.htmlを参照してください)。ランタイムの場合のロールバック、チェックされていない例外;") ただし、これはカスタマイズ可能な動作です

ALL または NOTHING の動作が必要な場合は、既存のコードに影響を与えることなく、PROPAGATION_REQUIRED であるデフォルトのトランザクション伝搬を維持できます。

于 2014-08-05T15:41:30.770 に答える