Postgresql spock测试执行后的数据库死锁

Postgresql spock测试执行后的数据库死锁,postgresql,spock,dbunit,Postgresql,Spock,Dbunit,我尝试在spock中编写dbunit测试,因此我将datasource配置为postgres数据库: @Bean public DataSource dataSource() { PGSimpleDataSource source = new PGSimpleDataSource(); source.setServerName(environment.getProperty("db.test.server.name")); source.s

我尝试在spock中编写dbunit测试,因此我将datasource配置为postgres数据库:

@Bean
    public DataSource dataSource() {
        PGSimpleDataSource source = new PGSimpleDataSource();
        source.setServerName(environment.getProperty("db.test.server.name"));
        source.setDatabaseName(environment.getProperty("db.test.database.name"));
        source.setUser(environment.getProperty("db.test.user.name"));
        source.setPassword(environment.getProperty("db.test.user.password"));

        return source;
    }
我有两种方法。一后的@:

def setup() {
        tester = new DataSourceDatabaseTester(dataSource)
        tester.setSchema("schema")
        tester.setSetUpOperation(DatabaseOperation.CLEAN_INSERT)
        tester.setTearDownOperation(DatabaseOperation.CLEAN_INSERT)
    }
在一点之前:

def cleanup() {
        tester.onTearDown();
    }
在我的测试groovy脚本中,我设置了事务

@Transactional(propagation = Propagation.REQUIRES_NEW)
class SimpleDaoTest extends CommonTestSetup{
定义的数据集:

 def data =dataSet {
        //simple data
    };
并给出了测试结果

@Test
@Rollback
void test(){
    //update operation
    //select operation
    //some check
}
问题是,在测试执行之后,postgres数据库上出现了一些死锁,测试从未完成。可能是代码行测试器.onTearDown();在提到的死锁上停止。为了检查它,我执行了查询

SELECT bl.pid     AS blocked_pid,
         a.usename  AS blocked_user,
         kl.pid     AS blocking_pid,
         ka.usename AS blocking_user,
         a.query    AS blocked_statement
   FROM  pg_catalog.pg_locks         bl
    JOIN pg_catalog.pg_stat_activity a  ON a.pid = bl.pid
    JOIN pg_catalog.pg_locks         kl ON kl.transactionid = bl.transactionid AND kl.pid != bl.pid
    JOIN pg_catalog.pg_stat_activity ka ON ka.pid = kl.pid
   WHERE NOT bl.granted;
它返回:

阻塞式pid;阻塞用户;阻塞pid;阻塞用户,阻塞语句 13387;“博士后”;13385;“博士后”;“权限不足”

谁能帮我一下我做错了什么,是什么导致了僵局?
感谢

问题在于数据库上的更新或删除会启动新事务,在事务结束之前,方法tester.onTearDown();有人打电话来。测试操作被提及的事务锁定

我通过改变来解决这个问题

def cleanup() {
        tester.onTearDown();
    }

数据库清理操作在给定测试上完成所有事务后进行

@AfterTransaction
    def cleanDatabase(){
        tester.onTearDown();
    }