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

时间:2015-02-20 22:27:36

标签: java spring scala transactions spring-transactions

鉴于我在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 calling txTemplate.execute(new TransactionalCallBack [T] {...}`。这允许我将方法声明为事务性,如下所示:

def foo = transactional() {
  //jdbcTemplate operations
}

2 个答案:

答案 0 :(得分:1)

事务由数据库(在您的情况下为Oracle)实现,而不是由spring实现。 Spring在很多类后面隐藏它,但实际上它只是在适当的时候调用JDBC连接方法(setAutoCommit,commit和rollback)。

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

答案 1 :(得分:0)

  

如果我的应用程序的多个副本收到要执行的请求   对同一数据源的数据库操作,操作仍然是   交易?

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

  

如果另一个程序员使用a连接到同一数据源   不同的图书馆,这里的行动仍然是   事务性?

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