最初の単体テスト クラスが機能するのに、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 がトランザクション コールバックを実行すると、新しいトランザクションも作成されませんか? その場合、同じことが起こるべきではありませんか (ロック待ちタイムアウト)。