- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 DAO 中的以下代码运行良好。
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>
我想知道的是
<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>
现在,TransactionManager 和代码(在我的例子中是 jdbc 模板)必须在同一个连接上运行。我假设他们都从 DataSource 获取 Connection 对象。 DataSource 池连接和它的机会,当您多次调用 getConnection 时,您将获得不同的连接对象。 spring 如何确保 TransactionManager 和 JdbcTemplate 最终获得相同的连接对象。我的理解是,如果不发生这种情况,回滚或提交将不起作用,对吗?有人能对此有更多的了解吗。
最佳答案
如果您查看JdbcTemplate
(execute(...)
方法之一)的代码,您将看到
Connection con = DataSourceUtils.getConnection(getDataSource());
它尝试从使用 TransactionSynchronizationManager
注册的 ConnectionHolder
检索 Connection
。
如果没有这样的对象,它只是从 DataSource
获取连接并注册它(如果它在事务环境中,即你有一个事务管理器)。否则,它会立即返回注册的对象。
这是代码(去掉了日志和东西)
ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource);
if (conHolder != null && (conHolder.hasConnection() || conHolder.isSynchronizedWithTransaction())) {
conHolder.requested();
if (!conHolder.hasConnection()) {
conHolder.setConnection(dataSource.getConnection());
}
return conHolder.getConnection();
}
// Else we either got no holder or an empty thread-bound holder here.
Connection con = dataSource.getConnection();
// flag set by the TransactionManager
if (TransactionSynchronizationManager.isSynchronizationActive()) {
// Use same Connection for further JDBC actions within the transaction.
// Thread-bound object will get removed by synchronization at transaction completion.
ConnectionHolder holderToUse = conHolder;
if (holderToUse == null) {
holderToUse = new ConnectionHolder(con);
}
else {
holderToUse.setConnection(con);
}
holderToUse.requested();
TransactionSynchronizationManager.registerSynchronization(
new ConnectionSynchronization(holderToUse, dataSource));
holderToUse.setSynchronizedWithTransaction(true);
if (holderToUse != conHolder) {
TransactionSynchronizationManager.bindResource(dataSource, holderToUse);
}
}
return con;
你会注意到 JdbcTemplate
试图
finally {
DataSourceUtils.releaseConnection(con, getDataSource());
}
释放连接,但这只会在您处于非事务环境中时发生,即。
if it is not managed externally (that is, not bound to the thread).
因此,在事务世界中,JdbcTemplate
将重用相同的 Connection
对象。
关于spring - TransactionTemplate 和 TransactionManager 连接对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18450866/
Spring 框架提供了两种编程事务管理的方法: 使用 TransactionTemplate . 使用 PlatformTransactionManager直接执行。 以上描述在这里:http://
由于并发访问,我遇到了数据结构损坏的问题。我试图排除可能的原因,但我不确定 Spring TransactionTemplate 是如何工作的。 有多个线程将独立列表传递给 CallbackHandl
我必须在处理变量之前更新数据库中变量的状态,以确保只有一个线程处理它。 为此,我正在使用 spring 的 transactionTemplate所以我的疑问是:如果我有类似的东西: Tran
我想知道 TransactionTemplate 的 setPropagationBehavior 究竟做了什么。谁向谁传播什么?我看到它有很好的文档记录,但我不了解此 PropagationBeha
我的 DAO 中的以下代码运行良好。 public void insert(final Person person) { transactionTemplate.execute(new Tra
我正在尝试使用 transactionTemplate 来管理我的交易。代码可能如下: private Boolean isCleanSuccess(){ return transaction
我正在使用 DB 连接池的自定义数据源(apache DBCP2 和 MySQL 数据库版本 8)进行连接池,并尝试使用 Spring TransactionTemplate 删除 DB 对象(超过
我的服务中有几个@Transactional私有(private)方法,由于不推荐使用@Transactional而不是私有(private)方法,所以我使用org.springframework.t
我的 Spring 应用程序中有一个特定的流程调用。 我有一个存储库,并且我在第一次调用时调用了 sell() 方法。 @Service @Transactional public class Ser
我目前正在处理的代码中有一个被许多线程使用的单例,除了 TransactionTemplate 和 SimpleJdbcTemplate 的两个字段外没有任何状态,这两个字段在单例函数中用于访问数据库
我不太确定如何提出这个问题,所以尽管告诉我我的想法完全错误。 我想使用 JdbcTemplate 和 TransactionTemplate。我首先将我的连接池初始化为数据源,然后创建一个事务管理器作
有人可以解释为什么第一个单元测试类工作而第二个测试类失败并出现锁定等待超时错误? 第一个类: public class Test1 extends AbstractTransactionalJUnit
我正在尝试创建 TransactionTemplate 的模拟 var tTemplate = MockRepository.GenerateMock(); var tDelegate = MockR
我是一名优秀的程序员,十分优秀!