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
是事务管理器,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 calling
txTemplate.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 它 ;)
鉴于我在 Oracle 数据源(使用 JDBCTemplate
)上执行的所有数据库操作都是使用使用 Spring 数据源 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 calling
txTemplate.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 它 ;)