我的 DAO 中以下代码运行得非常好。
以下是我的Spring配置。
现在,事务管理器和代码(在我这里是JDBC模板)必须操作相同的连接。我假设它们都从数据源获取连接对象。数据源池化连接,在多次调用getConnection时有可能会获得不同的连接对象。Spring是如何确保TransactionManager和JdbcTemplate最终获取相同的连接对象的呢?我的理解是,如果没有发生这种情况,回滚或提交将无法正常工作,对吗?能否有人更详细地解释一下这个问题。
public void insert(final Person person) {
transactionTemplate.execute(new TransactionCallback<Void>() {
public Void doInTransaction(TransactionStatus txStatus) {
try {
getJdbcTemplate().execute("insert into person(username, password) values ('" + person.getUsername() + "','" + person.getPassword() + "')");
} catch (RuntimeException e) {
txStatus.setRollbackOnly();
throw e;
}
return null;
}
});
}
以下是我的Spring配置。
<bean id="derbyds" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="org.apache.derby.jdbc.EmbeddedDriver" />
<property name="username" value="app" />
<property name="password" value="app" />
<property name="url" value="jdbc:derby:mytempdb" />
</bean>
<bean id="persondaojdbc" class="com.napp.dao.impl.PersonDaoJdbcImpl">
<property name="dataSource" ref="derbyds" />
<property name="transactionTemplate">
<bean class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager" />
</bean>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="derbyds"/>
</bean>
What i wanted to know is how does the
<bean id="persondaojdbc" class="com.napp.dao.impl.PersonDaoJdbcImpl">
<property name="dataSource" ref="derbyds" />
<property name="transactionTemplate">
<bean class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager" />
</bean>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="derbyds"/>
</bean>
现在,事务管理器和代码(在我这里是JDBC模板)必须操作相同的连接。我假设它们都从数据源获取连接对象。数据源池化连接,在多次调用getConnection时有可能会获得不同的连接对象。Spring是如何确保TransactionManager和JdbcTemplate最终获取相同的连接对象的呢?我的理解是,如果没有发生这种情况,回滚或提交将无法正常工作,对吗?能否有人更详细地解释一下这个问题。
@Transactional
的行为,除非你做类似于JdbcTemplate
所做的事情,即使用DataSourceUtils
和TransactionSynchronizationManager
。 - Sotirios Delimanolis