Skip to content

Commit 9b4fecf

Browse files
authored
Add support for AutoCommit true transactions (#3679)
* Add support for AutoCommit true transactions * Update DocStoreTransactionManager
1 parent 6f356fd commit 9b4fecf

File tree

7 files changed

+59
-17
lines changed

7 files changed

+59
-17
lines changed

ebean-core/src/main/java/io/ebeaninternal/server/transaction/DocStoreTransactionManager.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,12 @@ public DocStoreTransactionManager(TransactionManagerOptions options) {
2020

2121
@Override
2222
public SpiTransaction createTransaction(boolean explicit, int isolationLevel) {
23-
return createTransaction(explicit, null);
23+
return new DocStoreOnlyTransaction(explicit, this);
2424
}
2525

2626
@Override
2727
public SpiTransaction createReadOnlyTransaction(Object tenantId, boolean useMaster) {
2828
return new DocStoreOnlyTransaction(false, this);
2929
}
3030

31-
@Override
32-
protected SpiTransaction createTransaction(boolean explicit, Connection c) {
33-
return new DocStoreOnlyTransaction(explicit, this);
34-
}
3531
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package io.ebeaninternal.server.transaction;
2+
3+
import org.jspecify.annotations.Nullable;
4+
5+
import java.sql.Connection;
6+
7+
/**
8+
* Ebean transaction used for AutoCommit true connections.
9+
*/
10+
final class JdbcAutoCommitTransaction extends JdbcTransaction {
11+
12+
JdbcAutoCommitTransaction(boolean explicit, Connection connection, @Nullable TransactionManager manager) {
13+
super(true, explicit, connection, manager);
14+
}
15+
16+
@Override
17+
void performRollback() {
18+
long offset = profileOffset();
19+
if (profileStream != null) {
20+
profileStream.addEvent(EVT_ROLLBACK, offset);
21+
}
22+
}
23+
24+
@Override
25+
void performCommit() {
26+
long offset = profileOffset();
27+
if (profileStream != null) {
28+
profileStream.addEvent(EVT_COMMIT, offset);
29+
}
30+
}
31+
32+
}

ebean-core/src/main/java/io/ebeaninternal/server/transaction/JdbcTransaction.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,13 +90,17 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes {
9090
*/
9191
private final boolean skipCacheAfterWrite;
9292
DocStoreTransaction docStoreTxn;
93-
private ProfileStream profileStream;
93+
protected ProfileStream profileStream;
9494
private ProfileLocation profileLocation;
9595
private final Instant startTime = Instant.now();
9696
private final long startNanos;
9797
private boolean autoPersistUpdates;
9898

9999
JdbcTransaction(boolean explicit, Connection connection, TransactionManager manager) {
100+
this(false, explicit, connection, manager);
101+
}
102+
103+
JdbcTransaction(boolean autoCommit, boolean explicit, Connection connection, TransactionManager manager) {
100104
try {
101105
this.active = true;
102106
this.explicit = explicit;
@@ -125,7 +129,9 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes {
125129
this.onQueryOnlyCommit = true;
126130
}
127131

128-
checkAutoCommit(connection);
132+
if (!autoCommit) {
133+
checkAutoCommit(connection);
134+
}
129135

130136
} catch (Exception e) {
131137
throw new PersistenceException(e);

ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionFactory.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,18 @@
1313
abstract class TransactionFactory {
1414

1515
final TransactionManager manager;
16+
private final boolean autoCommitMode;
1617

1718
TransactionFactory(TransactionManager manager) {
1819
this.manager = manager;
20+
this.autoCommitMode = manager.isAutoCommitMode();
21+
}
22+
23+
/**
24+
* Return a new transaction.
25+
*/
26+
SpiTransaction createTransaction(boolean explicit, Connection connection) {
27+
return autoCommitMode ? new JdbcAutoCommitTransaction(explicit, connection, manager) : new JdbcTransaction(explicit, connection, manager);
1928
}
2029

2130
/**

ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionFactoryBasic.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public final SpiTransaction createTransaction(boolean explicit, int isolationLev
3939
Connection connection = null;
4040
try {
4141
connection = dataSource.getConnection();
42-
SpiTransaction t = manager.createTransaction(explicit, connection);
42+
SpiTransaction t = createTransaction(explicit, connection);
4343
return setIsolationLevel(t, isolationLevel);
4444
} catch (PersistenceException ex) {
4545
JdbcClose.close(connection);

ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionFactoryTenant.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public final SpiTransaction createTransaction(boolean explicit, int isolationLev
4848
try {
4949
Object tenantId = tenantProvider.currentId();
5050
connection = dataSourceSupplier.connection(tenantId);
51-
SpiTransaction transaction = manager.createTransaction(explicit, connection);
51+
SpiTransaction transaction = createTransaction(explicit, connection);
5252
transaction.setTenantId(tenantId);
5353
return setIsolationLevel(transaction, isolationLevel);
5454

ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionManager.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
55
import io.ebean.ProfileLocation;
66
import io.ebean.TxScope;
77
import io.ebean.annotation.PersistBatch;
8+
import io.ebean.annotation.Platform;
89
import io.ebean.annotation.TxType;
910
import io.ebean.cache.ServerCacheNotification;
1011
import io.ebean.cache.ServerCacheNotify;
1112
import io.ebean.config.CurrentTenantProvider;
1213
import io.ebean.config.dbplatform.DatabasePlatform;
13-
import io.ebean.datasource.DataSourcePool;
1414
import io.ebean.event.changelog.ChangeLogListener;
1515
import io.ebean.event.changelog.ChangeLogPrepare;
1616
import io.ebean.event.changelog.ChangeSet;
@@ -106,6 +106,7 @@ public class TransactionManager implements SpiTransactionManager {
106106
private final ServerCacheNotify cacheNotify;
107107
private final boolean supportsSavepointId;
108108
private final ConcurrentHashMap<String, ProfileLocation> profileLocations = new ConcurrentHashMap<>();
109+
private final boolean autoCommitMode;
109110

110111
/**
111112
* Create the TransactionManager
@@ -115,6 +116,7 @@ public TransactionManager(TransactionManagerOptions options) {
115116
this.logManager = options.logManager;
116117
this.databasePlatform = options.config.getDatabasePlatform();
117118
this.supportsSavepointId = databasePlatform.supportsSavepointId();
119+
this.autoCommitMode = databasePlatform.platform() == Platform.CLICKHOUSE;
118120
this.skipCacheAfterWrite = options.config.isSkipCacheAfterWrite();
119121
this.notifyL2CacheInForeground = options.notifyL2CacheInForeground;
120122
this.autoPersistUpdates = options.config.isAutoPersistUpdates();
@@ -206,6 +208,10 @@ public final void shutdown(boolean shutdownDataSource, boolean deregisterDriver)
206208
}
207209
}
208210

211+
final boolean isAutoCommitMode() {
212+
return autoCommitMode;
213+
}
214+
209215
/**
210216
* Return true if the DB platform supports SavepointId().
211217
*/
@@ -298,13 +304,6 @@ public SpiTransaction createReadOnlyTransaction(Object tenantId, boolean useMast
298304
return transactionFactory.createReadOnlyTransaction(tenantId, useMaster);
299305
}
300306

301-
/**
302-
* Create a new transaction.
303-
*/
304-
SpiTransaction createTransaction(boolean explicit, Connection c) {
305-
return new JdbcTransaction(explicit, c, this);
306-
}
307-
308307
/**
309308
* Process a local rolled back transaction.
310309
*/

0 commit comments

Comments
 (0)