Spring 数据源事务管理器:跨应用程序多个实例的事务性

Spring Datasource transaction manager: transactionality across multiple instances of an application

鉴于我在 Oracle 数据源(使用 JDBCTemplate)上执行的所有数据库操作都是使用使用 Spring 数据源 TransactionManager 的事务模板执行的,

为了说明我到底在做什么:

val txTemplate = new TransactionTemplate(txManager, txAttribute)
txTemplate.execute(func)

其中 func 是执行对 JDBCtemplate 的实际调用的函数,txManager 是事务管理器,txAttributeDefaultTransactionAttribute,其中我定义隔离、传播、超时等

事务管理器是 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
}

If multiple copies of my application receive requests to perform database operations on the same datasource, will the operations still be transactional?

事务行为不受数据源本身控制。数据源负责产生连接,而事务管理器负责管理事务边界。如果您将事务传播到所有操作,则 TransactionManager 会将它们分隔到同一事务中。事实上,可以在不同的数据源上进行分布式事务(使用两阶段提交)。

If another programmer connects to the same data source using a different library, will the operations performed here still be transactional?

客户端无法控制服务商交易。

事务由数据库(在您的情况下为 Oracle)实现,而不是由 spring 实现。 Spring 将它很好地隐藏在许多 类 后面,但本质上它只是在正确的时间调用 JDBC 连接方法(setAutoCommit、提交和回滚)。

您在事务中看到的数据(无论它是您应用程序的一部分还是其他人的)取决于事务隔离级别(google 它 ;)