Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rollback Transaction not working in SpringBootTest when i include the ShedLock library in the pom dependency #328

Open
ursankar opened this issue Aug 16, 2020 · 3 comments

Comments

@ursankar
Copy link

Rollback Transaction not working in SpringBootTest when i include the ShedLock library in the pom dependency:

HI @lukas-krecan
Can you please help with this issue. I was able to test the Shedlock successfully running in multiple pod instances in kubernetes using MySql/Aurora database. However, i have noticed now, running into a problem with Test class which used to have Transaction Rollback function working but it is not working now after i include the Shedlock in pom dependency. . Here are the annotations i have in the test class;

@SpringBootTest
@RunWith(value = SpringRunner.class)
@transactional
public class MyTest {

}

When i run the test, i don't see the rollback transaction info which i used to see when i did not include the "ShedLock libraries in the pom file" .

**************Rollback transaction log below that i can see if i comment out ShedLock in POM.xml *************
contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}', contextCustomizers = set[org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@6572421, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@6d763516, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@8cc191ca, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@5b8dfcc1, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@145f66e3], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map['org.springframework.test.context.web.ServletTestExecutionListener.activateListener' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.populatedRequestContextHolder' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.resetRequestContextHolder' -> true]]; transaction manager [org.springframework.orm.jpa.JpaTransactionManager@69a294d8]; rollback [true]
1
11:32:41.716 [main][tid=test_1234] INFO o.s.t.c.t.TransactionContext - Rolled back transaction for test:


Below is jpa info in my application.yml config and also the properties for my two datasource. I am using the mysql datasource

spring:
jpa:
database-platform: org.hibernate.dialect.H2Dialect
show-sql: true

mysql:
datasource:
jdbc-url: jdbc:mysql://localhost:3307/shedlockdb
username: admin
password: *****
driverClassName: com.mysql.cj.jdbc.Driver
h2:
datasource:
jdbc-url: jdbc:h2:mem:testdb
username: **
driverClassName: org.h2.Driver


This is the bean in my startup class to configure Shedlock datasource.
@bean
public LockProvider lockProvider(@qualifier("sqlDataSource") DataSource dataSource) {
return new JdbcTemplateLockProvider(builder()
.withJdbcTemplate(new JdbcTemplate(dataSource))
.usingDbTime()
.build());
}


This is my DatabaseConfiguration.java

@slf4j
@configuration
@EntityScan(
basePackageClasses = AbstractEntity.class)
@EnableJpaAuditing
@EnableJpaRepositories(
basePackageClasses = AbstractEntityRepository.class)
@EnableTransactionManagement
public class DatabaseConfiguration {

@value("${mysql.datasource.jdbc-url}")
private String mySqlHost;
@value("${mysql.datasource.username}")
private String mySqlUser;
@value("${mysql.datasource.password}")
private String mySqlPass;
@value("${mysql.datasource.driverClassName}")
private String mySqlDriver;

@value("${h2.datasource.jdbc-url}")
private String h2Host;
@value("${h2.datasource.username}")
private String h2User;
@value("${h2.datasource.driverClassName}")
private String h2Driver;

@bean(name = "sqlDataSource")
public DataSource getMysqlDataSource() {
log.info("getMysqlDataSource; mySqlHost={}; mySqlUser={}; mySqlDriver={}",mySqlHost,mySqlUser,mySqlDriver);
DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
dataSourceBuilder.url(mySqlHost);
dataSourceBuilder.username(mySqlUser);
dataSourceBuilder.password(mySqlPass);
dataSourceBuilder.driverClassName(mySqlDriver);
DataSource ds = dataSourceBuilder.build();
log.info("sqlDataSource; dataSource=={}; ",ds.toString());
return ds;
}

@primary
@bean(name = "h2DataSource")
public DataSource getH2DataSource() {
log.info("getH2DataSource; h2Host={}; h2User={}; h2Driver={}",h2Host,h2User,h2Driver);
DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
dataSourceBuilder.url(h2Host);
dataSourceBuilder.username(h2User);
dataSourceBuilder.driverClassName(h2Driver);
DataSource ds = dataSourceBuilder.build();
log.info("h2DataSource; dataSource=={}",ds.toString());
return ds;
}
}

@lukas-krecan
Copy link
Owner

Hi, thanks for the report. Does the tested method call ShedLock annotated method or does it happen for unralated tests too?

@zhahaoyu
Copy link

Any updates?

@bratwurzt
Copy link

Hi, thanks for the report. Does the tested method call ShedLock annotated method or does it happen for unralated tests too?

For me, it happens for unrelated tests, too.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants