2

Spring でのネストされたトランザクション処理と伝播を理解したい以下のシナリオがあります。私は実際にこれについて十分に読みましたが、いくつかの事実についてはまだ不明でした.

public class ServiceImpl {
@Autowired 
public AnotherService anotherService;

@Transactional // by default it is PROPOGATION_REQUIRED
public void insert (){
    anotherService.anotherInsert();
}
}

public class AnotherServiceImpl {

@Transactional(propagation = Propagation.NESTED)
public void anotherInsert() {
    insertSomeTestData();
}

private void insertSomeTestData() {
    // call insert some test data recursively
    // insert trasaction
    insertSomeTestData();
}
}

このシナリオでanotherInsertは、ネストされたデータをコミットし、一部のデータをロールバックします。これは、デフォルトである外側のトランザクションに影響しPROPOGATION_REQUIREDますか?また、不明な点は、トランザクションがネストされている場合、そのような場合に新しいものを開始しますか?

4

2 に答える 2

2

「AnotherService.anotherInsert」呼び出しは、ServiceImpl.insert からの既存のトランザクションの下に、ネストされた論理トランザクションを作成します。

ネストされたトランザクションのロールバックは、REQUIRES_NEW 動作のように、プライマリ トランザクションをロールバックしません。

仕様:

PROPAGATION_NESTED は、ロールバックできる複数のセーブポイントを持つ単一の物理トランザクションを使用します。このような部分的なロールバックにより、内側のトランザクション スコープがそのスコープのロールバックをトリガーできるようになり、一部の操作がロールバックされたにもかかわらず、外側のトランザクションは物理的なトランザクションを続行できます。この設定は通常、JDBC セーブポイントにマップされるため、JDBC リソース トランザクションでのみ機能します。Spring の DataSourceTransactionManager を参照してください。

ただし、NESTED トランザクションは、単一の物理トランザクションを使用するJDBC セーブポイントに基づいていることに注意してください。これは、JDBC データソースと次のトランザクション マネージャーを使用して動作させる必要があることを意味します。

org.springframework.jdbc.datasource.DataSourceTransactionManager

参照。http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html#tx-propagation-nested

于 2015-10-27T14:06:18.100 に答える
2

NESTEDの説明はこちら

「現在のトランザクションが存在する場合、ネストされたトランザクション内で実行するか、そうでない場合は PROPAGATION_REQUIRED のように動作します」

上記のシナリオでは、現在のトランザクションが 1 つ存在するため、ネストされたトランザクションの下で実行され続け、新しいトランザクションは作成されません。

私が間違っている場合は修正してください。ありがとう

于 2012-10-31T07:01:14.127 に答える