【发布时间】:2015-04-22 17:50:06
【问题描述】:
鉴于我在 Oracle 数据源上执行的所有数据库操作(使用 JDBCTemplate)都是使用使用 Spring Datasource TransactionManager 的事务模板执行的,
- 如果我的应用程序的多个副本收到对同一数据源执行数据库操作的请求,这些操作是否仍然是事务性的?
- 如果另一个程序员使用不同的库连接到同一个数据源,这里执行的操作仍然是事务性的吗?
为了说明我在做什么:
val txTemplate = new TransactionTemplate(txManager, txAttribute)
txTemplate.execute(func)
其中func 是执行对JDBCtemplate 的实际调用的函数,txManager 是事务管理器,txAttribute 是DefaultTransactionAttribute,我在其中定义隔离、传播、超时等。
事务管理器是 Spring 中定义的一个单例,它将我的数据源作为参数。
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<constructor-arg ref="dataSource"/>
</bean>
<bean id="dataSource" class="oracle.jdbc.pool.OracleConnectionPoolDataSource">
...
</bean>
注意:
当我在 Scala 中编写此代码时,我已经定义了将函数 func 包装在 TransactionCallback 中的隐式,如下所示:
implicit def txCallbackImplicit[T](func: => T): TransactionCallback[T] = {
new TransactionCallback[T] {
def doInTransaction(status: TransactionStatus) = func.asInstanceOf[T]
}
}
所以,txTemplate.execute(func) is actually callingtxTemplate.execute(new TransactionalCallBack[T] {...}`。这让我可以像这样声明一个事务方法:
def foo = transactional() {
//jdbcTemplate operations
}
【问题讨论】:
标签: java spring scala transactions spring-transactions