Spring поддерживает программные транзакции, которые дают нам прекрасный контроль над управлением TX. Согласно Спринг документации, можно использовать программное управление TX по:
1. Используя TransactionTemplate весны:Сложный программный контроль транзакций?
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
protected void doInTransactionWithoutResult(TransactionStatus status) {
try {
updateOperation1();
updateOperation2();
} catch (SomeBusinessExeption ex) {
status.setRollbackOnly();
}
} });
2. Используя PlatformTransactionManager непосредственно (инъекционные реализацию PlatformTransactionManager в DAO):
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setName("SomeTxName");
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
//txManager is a reference to PlatformTransactionManager
TransactionStatus status = txManager.getTransaction(def);
try {
updateOperation1();
updateOperation2();
}
catch (MyException ex) {
txManager.rollback(status);
throw ex;
}
txManager.commit(status);
для ради упрощения, скажем, мы имеем дело с операцией базы данных JDBC.
мне интересно, для каких-либо операций с базой данных произошло на updateOperation1(),updateOperation2()
во втором фрагменте, либо он осуществляется с JDBCTemplate
или JDBCDaoSupport
, если нет, то операция фактически не выполняется в рамках какой-либо сделки, не так ли?
Мой анализ состоит в том, что, если мы не используем JDBCTemplate
или JDBCDaoSupport
, мы неизбежно создадим/заимствуем соединение из управления источниками данных. мы получаем соединение, конечно, не соединение, используемое PlatformTransactionManager
, лежащее в основе управления транзакцией.
Я выкопал исходный код Spring и связанный с ним класс, что PlatformTransactionManager
попытается получить соединение, содержащееся в ConnectionHolder
, которое в свою очередь получено из TransactionSynchronizationManager
. Я также нашел JDBCTemplate
и JDBCDaoSupport,
также попытаться получить соединение с аналогичной процедурой из TransactionSynchronizationManager.
Поскольку TransactionSynchronizationManager
управляет много ресурсов, включая соединение в поток (в основном использует Threadlocal
, чтобы обеспечить один поток получить свой собственный уникальный экземпляр управляемого ресурса)
Таким образом, я думаю, что соединение, полученное PlatformTransactionManager и JDBCTemplate
или JDBCDaoSupport
, является таким же, это может объяснить, как весенняя программная транзакция гарантирует, что updateOperation1(),updateOperation2()
были защищены транзакцией.
Является ли мой анализ правильным? если это так, почему весенняя документация не подчеркнула этого оговорки?