在我SpringBoot的应用程序,我有一个简单的测试案例,在这里我想这样的: 插入一些数据到数据库中的测试 之前做一些验证测试 删除数据从数据库测试后 这就是我写的:数据库死锁使用SQL前后-
保存sql-s的接口。
@Target(METHOD)
@Retention(RUNTIME)
@Sql(scripts = "/insert-data-before.sql", config = @SqlConfig(transactionMode = ISOLATED), executionPhase = BEFORE_TEST_METHOD)
@Sql(scripts = "/delete-data-after.sql", config = @SqlConfig(transactionMode = ISOLATED), executionPhase = AFTER_TEST_METHOD)
public @interface PrepareAndRollbackDataForTesting {
}
测试类:
@RunWith(SpringRunner.class)
@ConfigurationProperties(prefix = "server")
@SpringBootTest(classes = MyTestApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT)
@Transactional
public abstract class MyTestClass {
@Test
@PrepareAndRollbackDataForTesting
public void testTheData() {
//do something
}
}
嵌入数据before.sql:
BEGIN TRANSACTION;
INSERT INTO mytable(id, name) VALUES (1, 'test');
COMMIT;
删除数据,after.sql:
BEGIN TRANSACTION;
DELETE FROM mytable;
COMMIT;
但如果我这样写,它会在de adlock。
如果我从界面中删除了delete-data-after.sql @Sql,它工作正常!
此外,如果我从界面中删除@ Sql-s的配置,它工作正常!
但我想在单独的事务中运行插入和删除sql,以确保它将删除所有数据,而不管在方法内发生了什么,即使是在异常情况下!
你用于测试的数据库是什么?大多数嵌入式数据库不支持多个事务。 – voliveira89
在这里发表你的表结构+死锁图 – sepupic
谢谢你们,但我终于回答了! – victorio