2017-08-29 82 views
0

在我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,以確保它將刪除所有數據,而不管在方法內發生了什麼,即使是在異常情況下!

+0

你用於測試的數據庫是什麼?大多數嵌入式數據庫不支持多個事務。 – voliveira89

+0

在這裏發表你的表結構+死鎖圖 – sepupic

+0

謝謝你們,但我終於回答了! – victorio

回答

0

我已經找到了!

我只是要刪除接口的配置:

@Target(METHOD) 
@Retention(RUNTIME) 
@Sql(scripts = "/insert-data-before.sql", executionPhase = BEFORE_TEST_METHOD) 
@Sql(scripts = "/delete-data-after.sql", executionPhase = AFTER_TEST_METHOD) 
public @interface PrepareAndRollbackDataForTesting { 
} 

因爲@Transactional註釋將採取交易的關懷,之後將回滾。

編輯:

而且我刪除BEGIN TRANSACTION,並從獲得的SQL COMMIT啄。

+0

或者不要自己開始交易。您已經爲該腳本啓動了一個新事務,以便之後進行提交。當你開始另一個tx時,你就陷入了僵局。 –

+0

哦,是的,我忘了提及我從sqls中刪除了BEGIN TRANSACTION和COMMIT thingy – victorio