2

最初の単体テスト クラスが機能するのに、2 番目のテスト クラスがロック待機タイムアウト エラーで失敗する理由を説明してください。

最初のテストクラス:

public class Test1 extends AbstractTransactionalJUnit4SpringContextTests {

    @Before
    public void setUp() {
       // do stuff through hibernate to populate database with test data
    }

    @Test
    @Transactional(propagation = Propagation.NEVER)
    public void testDeleteObject() {

    TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
    transactionTemplate.execute(new TransactionCallbackWithoutResult() {
        @Override
        protected void doInTransactionWithoutResult(TransactionStatus status) {
            try {
               // execute sql that deletes data populated in setUp() [i.e. this will require locks on the objects].
            }
        });
    }
}

2 番目のテスト クラス [ロック待機タイムアウト エラーを取得]:

public class Test2 extends AbstractTransactionalJUnit4SpringContextTests {

    @Before
    public void setUp() {
       // do stuff through hibernate to populate database with test data
    }

    @Test
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void testObject() {

    // execute sql that deletes data populated in setUp() [i.e. this will require locks on the objects].

    }
}

2 つのトランザクションが同じロックを求めて競合しているため、2 番目のテスト クラスが失敗することを理解していますが、どちらも in_progress トランザクション状態のためにロックを放棄することはできません。私が混乱しているのは、最初のテストクラスがSQLの実行に成功した理由です。おそらくこれは間違っていると思いますが、transactionTemplate がトランザクション コールバックを実行すると、新しいトランザクションも作成されませんか? その場合、同じことが起こるべきではありませんか (ロック待ちタイムアウト)。

4

2 に答える 2

2

デフォルトでは、TransactionTemplate は新しいトランザクションを作成しません。デフォルトの伝播動作は PROPAGATION_REQUIRED です。最初のケースでは、セットアップと削除が同じトランザクションで行われるため、ロックの問題はありません。

クラス org.springframework.orm.jpa.JpaTransactionManager (または org.springframework パッケージ全体) のログ レベルを DEBUG に設定することで、新しいトランザクションがいつ作成されたか、または既存のトランザクションが再利用されたかを確認できます。

伝搬動作の Javadoc

于 2012-09-24T08:26:28.060 に答える