Bei DataSourcetransactionManager. DOBEGIN () -Methode erstellt keine neue Verbindung?Java

Java-Forum
Anonymous
 Bei DataSourcetransactionManager. DOBEGIN () -Methode erstellt keine neue Verbindung?

Post by Anonymous »

Wenn wir DataSourcetransactionManager DOBEGIN-Methoden verwenden, um die Transaktion zu öffnen, funktioniert es wie folgt: < /p>

Code: Select all

protected void doBegin(Object transaction, TransactionDefinition definition) {
DataSourceTransactionObject txObject = (DataSourceTransactionObject) transaction;
Connection con = null;

try {
if (!txObject.hasConnectionHolder() ||
txObject.getConnectionHolder().isSynchronizedWithTransaction()) {
Connection newCon = this.dataSource.getConnection();
if (logger.isDebugEnabled()) {
logger.debug("Acquired Connection [" + newCon + "] for JDBC transaction");
}
txObject.setConnectionHolder(new ConnectionHolder(newCon), true);
}

txObject.getConnectionHolder().setSynchronizedWithTransaction(true);
con = txObject.getConnectionHolder().getConnection();

Integer previousIsolationLevel = DataSourceUtils.prepareConnectionForTransaction(con, definition);
txObject.setPreviousIsolationLevel(previousIsolationLevel);

// Switch to manual commit if necessary. This is very expensive in some JDBC drivers,
// so we don't want to do it unnecessarily (for example if we've explicitly
// configured the connection pool to set it already).
if (con.getAutoCommit()) {
txObject.setMustRestoreAutoCommit(true);
if (logger.isDebugEnabled()) {
logger.debug("Switching JDBC Connection [" + con + "] to manual commit");
}
con.setAutoCommit(false);
}

prepareTransactionalConnection(con, definition);
txObject.getConnectionHolder().setTransactionActive(true);

int timeout = determineTimeout(definition);
if (timeout != TransactionDefinition.TIMEOUT_DEFAULT) {
txObject.getConnectionHolder().setTimeoutInSeconds(timeout);
}

// Bind the connection holder to the thread.
if (txObject.isNewConnectionHolder()) {
TransactionSynchronizationManager.bindResource(getDataSource(), txObject.getConnectionHolder());
}
}

catch (Throwable ex) {
if (txObject.isNewConnectionHolder()) {
DataSourceUtils.releaseConnection(con, this.dataSource);
txObject.setConnectionHolder(null, false);
}
throw new CannotCreateTransactionException("Could not open JDBC Connection for transaction", ex);
}
}
Die Situation, über die ich verwirrt bin der Thread) anstatt eine neue Verbindung zu erstellen. In dem Fall, in dem es eine äußere Transaktion gibt, sollte der Anbieter von TxObject über die Suspend -Methode auf Null eingestellt werden. Hier sollte es also der Fall sein, in dem es keine äußere Transaktion gibt, und TxObject hat den Anbieter des Threads aus dem Thread erhalten, aber keine Transaktion gestartet. Br />

Code: Select all

SuspendedResourcesHolder suspendedResources = suspend(null);
< /code>
Ich möchte wissen, in welchen Szenarien Frühling die Verbindung im Thread wiederverwendet, wenn Sie eine Transaktion über die DOBIN -Methode starten? Nach meinem Verständnis denke ich, dass eine neue Transaktion immer eine neue Verbindung herstellen sollte. Würde es ansonsten nicht den Zustand der äußeren Verbindung ändern, z. B. das AutoCommit auf false usw.? Ich hoffe, jemand kann meine Verwirrung lösen. Vielen Dank.if (!txObject.hasConnectionHolder() ||
txObject.getConnectionHolder().isSynchronizedWithTransaction()) {

Connection newCon = this.dataSource.getConnection();

if (logger.isDebugEnabled()) {
logger.debug("Acquired Connection [" + newCon + "] for JDBC transaction");
}

txObject.setConnectionHolder(new ConnectionHolder(newCon), true);
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post