鉴于我在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
}
答案 0 :(得分:1)
事务由数据库(在您的情况下为Oracle)实现,而不是由spring实现。 Spring在很多类后面隐藏它,但实际上它只是在适当的时候调用JDBC连接方法(setAutoCommit,commit和rollback)。
您在交易中看到的数据(无论是您的应用程序的一部分还是其他人)取决于交易隔离级别(google it;)
答案 1 :(得分:0)
如果我的应用程序的多个副本收到要执行的请求 对同一数据源的数据库操作,操作仍然是 交易?
事务行为不受数据源本身的控制。当TransactionManager负责管理事务边界时,数据源负责生成连接。如果将事务传播到所有操作,则TransactionManager会将它们分隔到同一事务中。实际上,可以在不同的数据源上进行分布式事务(使用两阶段提交)。
如果另一个程序员使用a连接到同一数据源 不同的图书馆,这里的行动仍然是 事务性?
客户端无法控制服务提供商的交易。