I need to commit/rollback transactions manually with multiple datasources in micronaut-data. But when commits second transaction(db2TransactionManager.commit(db2Transaction)
) it throws below exception. How can I solve this problem or is there any other way, also I tried with defining @Repository
and @Transactional
etc., but there is other problem that commits transactions separately?
java.lang.IllegalStateException: Transaction synchronization is not active
at io.micronaut.transaction.support.TransactionSynchronizationManager.getSynchronizations(TransactionSynchronizationManager.java:334)
at io.micronaut.transaction.support.TransactionSynchronizationUtils.triggerBeforeCompletion(TransactionSynchronizationUtils.java:100)
at io.micronaut.transaction.support.AbstractSynchronousTransactionManager.triggerBeforeCompletion(AbstractSynchronousTransactionManager.java:1011)
at io.micronaut.transaction.support.AbstractSynchronousTransactionManager.processCommit(AbstractSynchronousTransactionManager.java:863)
at io.micronaut.transaction.support.AbstractSynchronousTransactionManager.commit(AbstractSynchronousTransactionManager.java:807)
DemoService.java
@Singleton
public class DemoService {
private final SynchronousTransactionManager<Connection> db1TransactionManager;
private final SynchronousTransactionManager<Connection> db2TransactionManager;
private final SynchronousTransactionManager<Connection> db3TransactionManager;
@Inject
public LogsterSynchronizerService(@Named("db1") SynchronousTransactionManager<Connection> db1TransactionManager,
@Named("db2") SynchronousTransactionManager<Connection> db2TransactionManager,
@Named("db3") SynchronousTransactionManager<Connection> db3TransactionManager) {
this.db1TransactionManager = db1TransactionManager;
this.db2TransactionManager = db2TransactionManager;
this.db3TransactionManager = db3TransactionManager;
}
public void processRecords() {
TransactionStatus<Connection> db1Transaction = db1TransactionManager.getTransaction(null);
db1TransactionManager.executeWrite(status -> insertDb1(status.getConnection()));
TransactionStatus<Connection> db2Transaction = db2TransactionManager.getTransaction(null);
db2TransactionManager.executeWrite(status -> insertDb2(status.getConnection()));
TransactionStatus<Connection> db3Transaction = db3TransactionManager.getTransaction(null);
db3TransactionManager.executeWrite(status -> insertDb3(status.getConnection()));
db1TransactionManager.commit(db1Transaction);
db2TransactionManager.commit(db2Transaction);
db3TransactionManager.commit(db3Transaction);
}
private int insertDb1(Connection db1Connection) throws SQLException {
String sql = "INSERT INTO tbl_demo(dt) VALUES (SYSTIMESTAMP)";
PreparedStatement ps = db1Connection.prepareStatement(sql);
return ps.executeUpdate();
}
private int insertDb2(Connection db2Connection) throws SQLException {
String sql = "INSERT INTO tbl_demo(dt) VALUES (SYSTIMESTAMP)";
PreparedStatement ps = db2Connection.prepareStatement(sql);
return ps.executeUpdate();
}
private int insertDb3(Connection db3Connection) throws SQLException {
String sql = "INSERT INTO tbl_demo(dt) VALUES (SYSTIMESTAMP)";
PreparedStatement ps = db3Connection.prepareStatement(sql);
return ps.executeUpdate();
}
}
application.yml
micronaut:
application:
name: demo-app
datasources:
db1:
url: jdbc:oracle:thin:@db1.demo.com:1521:db1
driverClassName: oracle.jdbc.OracleDriver
username: test
password: test
schema-generate: none
dialect: ORACLE
auto-commit: false
maximum-pool-size: 3
minimum-idle: 1
idle-timeout: 5
db2:
url: jdbc:oracle:thin:@db2.demo.com:1522:db2
driverClassName: oracle.jdbc.OracleDriver
username: test
password: test
schema-generate: none
dialect: ORACLE
auto-commit: false
maximum-pool-size: 3
minimum-idle: 1
idle-timeout: 5
db3:
url: jdbc:oracle:thin:@db3.demo.com:1522:db3
driverClassName: oracle.jdbc.OracleDriver
username: test
password: test
schema-generate: none
dialect: ORACLE
auto-commit: false
maximum-pool-size: 3
minimum-idle: 1
idle-timeout: 5
netty:
default:
allocator:
max-order: 3
pom.xml
...
<properties>
<packaging>jar</packaging>
<jdk.version>11</jdk.version>
<release.version>11</release.version>
<micronaut.version>3.4.2</micronaut.version>
<micronaut.data.version>3.3.0</micronaut.data.version>
<exec.mainClass>com.demo.Application</exec.mainClass>
<micronaut.runtime>netty</micronaut.runtime>
</properties>
...
<dependency>
<groupId>io.micronaut.data</groupId>
<artifactId>micronaut-data-jdbc</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>io.micronaut.sql</groupId>
<artifactId>micronaut-jdbc-hikari</artifactId>
<scope>compile</scope>
</dependency>
...