gpt4 book ai didi

spring - TransactionTemplate vs @Transactional(propagation = Propagation.REQUIRES_NEW)

转载 作者:行者123 更新时间:2023-12-04 05:48:43 29 4
gpt4 key购买 nike

有人可以解释为什么第一个单元测试类工作而第二个测试类失败并出现锁定等待超时错误?

第一个类:

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].
}
});
}
}

第二个测试类【获取锁等待超时错误】:
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].

}
}

我知道第二个测试类失败是因为两个事务正在争取相同的锁,但由于其 in_progress 事务状态,两个事务都不能放弃锁。我感到困惑的是为什么第一个测试类成功执行了 sql。我可能理解错了,但是当 transactionTemplate 执行事务回调时,是否也创建了一个新事务?在那种情况下,不应该发生同样的事情(锁定等待超时)吗?

最佳答案

仅当有两个或多个连接访问相同数据时才会发生死锁。如果测试用例用传播注释 NEVER你只有一笔交易,一笔由 TransactionTemplate 创建的.

第二种情况对我来说有点模糊。异常意味着有两个并发连接/事务 - 一个用于 setUp一个用于 testObject .传播REQUIRES_NEW即使检测到一个连接,也确实会强制执行另一个连接,但我希望 setUp也将在此交易中启动。您可以尝试摆脱 @TransactionaltestObject . AbstractTransactionalJUnit4SpringContextTests@Transactional 注释本身具有默认传播,即 REQUIRED我相信。

关于spring - TransactionTemplate vs @Transactional(propagation = Propagation.REQUIRES_NEW),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10361761/

29 4 0
文章推荐: web-services - 如何使用 Ksoap 2 从 Web 服务 (.NET) 方法获取 List 到应用程序 android