在我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