【问题标题】:Spring Datasource transaction manager: transactionality across multiple instances of an applicationSpring Datasource 事务管理器:跨应用程序多个实例的事务性
【发布时间】:2015-04-22 17:50:06
【问题描述】:

鉴于我在 Oracle 数据源上执行的所有数据库操作(使用 JDBCTemplate)都是使用使用 Spring Datasource 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
}

【问题讨论】:

    标签: java spring scala transactions spring-transactions


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      如果我的应用程序的多个副本收到执行请求 同一数据源上的数据库操作,操作是否仍然 是事务性的?

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

      如果另一个程序员使用 不同的库,这里执行的操作是否仍然是 事务性的?

      客户端无法控制服务提供者事务。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-26
        • 2019-06-12
        • 1970-01-01
        • 1970-01-01
        • 2020-05-21
        • 1970-01-01
        • 2022-09-27
        • 2022-01-27
        相关资源
        最近更新 更多