Когда DataSourcetransactionManager. Метод dobegin () не создает нового соединения?JAVA

Программисты JAVA общаются здесь
Anonymous
Когда DataSourcetransactionManager. Метод dobegin () не создает нового соединения?

Сообщение Anonymous »

Когда мы используем методы DataSourCetransActionManager Dobegin для открытия транзакции, она работает так: < /p>
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);
}
}

Ситуация, в которой я озадачен, заключается в том, что Spring будет использовать соединение подключения к Txobject в определенных условиях (получено с помощью TransactionSynchronization manager при инициализации и связанном с поток) вместо создания нового соединения. В случае, когда существует внешняя транзакция, подключение к соединению txobject должна быть установлена ​​на NULL с помощью метода приостановки. Итак, это должно быть случай, когда нет внешней транзакции, и txobject получил подключающееся владельцы из потока, но не запустил транзакцию, вы можете обратиться к здесь (AbstractPlatformTransactionManager.getTransaction):
SuspendedResourcesHolder suspendedResources = suspend(null);
< /code>
Я хочу знать в каких сценариях пружина повторно использует соединение в потоке при запуске транзакции через метод добегина? По моему пониманию, я думаю, что новая транзакция должна всегда создавать новую связь. В противном случае, разве это не изменит состояние внешнего соединения, например, установление автопоммиты в False и т. Д.? Я надеюсь, что кто -то сможет решить мою путаницу. Большое спасибо. < /P>
При каких обстоятельствах метод добегина не создаст новое соединение?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);
}


Подробнее здесь: https://stackoverflow.com/questions/794 ... -new-conne

Вернуться в «JAVA»