2

私の問題は単純です。サービス メソッドの呼び出しによって発生したすべてのデータベースの変更をロールバックしたいと考えています。正しい注釈付けに問題があります。@Transactionalどこに配置し、どこに Propagation をREQUIRES_NEWまたはに設定すればよいか、よくわかりませんMANDATORY。私が書いたコードを貼り付けます。これは、SQLExceptionスローされたという事実を除けば、 db changes をロールバックしません

コード:

@Service
public class SwapInsertService {

    @Autowired
    MyDao myDao;

    @Transactional(propagation = Propagation.REQURIES_NEW, rollbackFor = SQLException.class)
    public void insertToManyTables(MyData data) throws SQLException {

        insertToSpecificTables(data);
        myDao.insertTwo(data);
    }

    @Transactional(propagation = Propagation.MANDATORY)
    public void insertToSpecificTables(MyData data) throws SQLException {

        myDao.insertOne(data);
    }
}

@Repository
public class MyDaoImpl implements MyDao {

    @Transactional(propagation = Propagation.MANDATORY)
    public void insertOne(MyData data) throws SQLException {

        // INSERT
    }

    @Transactional(propagation = Propagation.MANDATORY)
    public void insertTwo(MyData data) throws SQLException {

        // throws SQLException 
    }
}

insertTwothrowsとしましょうSQLException。以前の挿入をすべてロールバックしたいと思います。私は何を間違っていますか?

私の理解:

Propagation.REQURIES_NEW新しいトランザクションを作成します。 Propagation.MANDATORY現在のトランザクションをサポートします。

insertTwoエラーをスローし、insertToManyTablesすべてをロールバックして、ほら。残念ながら、それはそれほど簡単ではありません。

編集CGLIB:プロキシに使用していることに言及することが重要です。

4

1 に答える 1

4

Spring固有のxmlのデータソース構成でAUTO_COMMITがfalseに設定されているかどうかを確認します

于 2012-09-20T17:08:17.650 に答える