spring能不能对多个数据库进行事务管理

spring能不能对多个数据库进行事务管理,第1张

可以,Spring的事务处理能力是最综合完整的,对编程式、声明式均进行了支持,而且可以在不使用应用服务器的情况下兼容应用服务器事务。下面的是一个分布式的声明事务,访问多个数据源的配置:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans default-autowire="byName">

<!-- Configurer that replaces ${...} placeholders with values from a properties

file -->

<!-- (in this case, JDBC-related settings for the dataSource definition

below) -->

<bean id="propertyConfigurer"

class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

<property name="locations">

<list>

<value>classpath*:spring/jdbc.properties</value>

</list>

</property>

</bean>

<bean id="dataSourceMysql" class="com.atomikos.jdbc.AtomikosDataSourceBean"

init-method="init" destroy-method="close">

<property name="uniqueResourceName" value="${mysql.uniqueResourceName}" />

<property name="xaDataSourceClassName" value="${mysql.xaDataSourceClassName}" />

<property name="xaProperties">

<props>

<prop key="user">${mysql.user}</prop>

<prop key="password">${mysql.password}</prop>

<prop key="URL">${mysql.url}</prop>

</props>

</property>

<property name="poolSize" value="${mysql.poolSize}" />

</bean>

<bean id="dataSourceOracle" class="com.atomikos.jdbc.AtomikosDataSourceBean"

init-method="init" destroy-method="close">

<property name="uniqueResourceName" value="${oracle.uniqueResourceName}" />

<property name="xaDataSourceClassName" value="${oracle.xaDataSourceClassName}" />

<property name="xaProperties">

<props>

<prop key="user">${oracle.user}</prop>

<prop key="password">${oracle.password}</prop>

<prop key="URL">${oracle.url}</prop>

</props>

</property>

<property name="poolSize" value="${oracle.poolSize}" />

</bean>

<!-- Construct Atomikos UserTransactionManager, needed to configure Spring -->

<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"

init-method="init" destroy-method="close">

<!-- when close is called, should we force transactions to terminate or

not? -->

<property name="forceShutdown" value="${transactionManager.forceShutdown}" />

</bean>

<!-- Also use Atomikos UserTransactionImp, needed to configure Spring -->

<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">

<property name="transactionTimeout" value="${transactionManager.transactionTimeout}" />

</bean>

<!-- Configure the Spring framework to use JTA transactions from Atomikos -->

<bean id="transactionManager"

class="org.springframework.transaction.jta.JtaTransactionManager">

<property name="transactionManager">

<ref bean="atomikosTransactionManager" />

</property>

<property name="userTransaction">

<ref bean="atomikosUserTransaction" />

</property>

</bean>

<bean id="txManager"

class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"

abstract="true">

<property name="transactionManager">

<ref bean="transactionManager" />

</property>

<property name="transactionAttributes">

<props>

<prop key="save*">PROPAGATION_REQUIRED, +AuaException</prop>

</props>

</property>

</bean>

<bean id="studentOracleDao" class="com.aua.dao.oracle.StudentDao" />

<bean id="studentMysqlDao" class="com.aua.dao.mysql.StudentDao" />

<bean id="studentService" parent="txManager">

<property name="target">

<bean class="com.aua.service.impl.StudentService" />

</property>

</bean>

</beans>

简单来说就是 单一的逻辑单元处理一系列事物。 *** 作一系列数据时,如有一条不合适或取消,所有数据均会到最初状态,即回滚。

说的比较抽象,我给你举个小例子你就明白了。

例如 ATM 机。

用户把钱从一个银行账号转账至另一个银行账号,这种 *** 作不能被部分完成。

如转的过程中 1卡钱被相应扣除,2卡在存中,这时机器出现故障,转账被取消。取消的同时,即要事物回滚,回到1卡原有的状态。

明白了吗

事务管理对于一系列数据库 *** 作进行管理。

一个事务包含一个或多个SQL语句,是逻辑管理的工作单元(原子单元)。

一个事务开始于第一次执行的SQL语句,结束于Commit

Rollback

DDL语句。

注意:其中Commit,

Rollback是显示的提交事务,而DDL语句是隐式的提交事务的。DDL语句的 *** 作是没有办法回滚的。

事务处理(TRANSACTION)是由一个或多个SQL语句序列结合在一起所形成的一个逻辑处理单元。事务处理中的每个语句都是完成整个任务的一部分工作,所有的语句组织在一起能够完成某一特定的任务。DBMS在对事务处理中的语句进行处理时,是按照下面的约定来进行的,这就是“事务处理中的所有语句被作为一个原子工作单位,所有的语句既可成功地被执行,也可以没有任何一个语句被执行”。DBMS负责完成这种约定,即使在事务处理中应用程序异常退出,或者是硬件出现故障等各种意外情况下,也是如此。在任何意外情况下,DBMS都负责确保在系统恢复正常后,数据库内容决不会出现“部分事务处理中的语句被执行完”的情况。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9406741.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存