Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 使用Atomikos的两阶段提交(2PC)配置_Spring_Jta_Atomikos_2phase Commit - Fatal编程技术网

Spring 使用Atomikos的两阶段提交(2PC)配置

Spring 使用Atomikos的两阶段提交(2PC)配置,spring,jta,atomikos,2phase-commit,Spring,Jta,Atomikos,2phase Commit,我正在创建一个示例应用程序来测试两阶段提交(2PC)。我从互联网上获取了这里使用的代码位。我正在使用Spring、Hibernate和Atomikos,MySQL作为后端。我使用两个数据库,故意调用第二个数据库,但无法检查第一个数据库调用是否回滚。遗憾的是,它似乎不起作用。有人能给我指出一些带有示例代码的链接吗 以下是我的配置: 休眠会话工厂: <bean id="sessionFactory1" class="org.springframework.orm.hibernate3.Loca

我正在创建一个示例应用程序来测试两阶段提交(2PC)。我从互联网上获取了这里使用的代码位。我正在使用Spring、Hibernate和Atomikos,MySQL作为后端。我使用两个数据库,故意调用第二个数据库,但无法检查第一个数据库调用是否回滚。遗憾的是,它似乎不起作用。有人能给我指出一些带有示例代码的链接吗

以下是我的配置:
休眠会话工厂:

<bean id="sessionFactory1" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource">
        <ref bean="dataSource1"/>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.connection.isolation">3</prop>    
            <prop key="hibernate.current_session_context_class">jta</prop>    
            <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</prop>    
            <prop key="hibernate.transaction.manager_lookup_class">com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup</prop> 
            <prop key="hibernate.connection.release_mode">on_close</prop>
        </props>
    </property>

    <property name="mappingResources">
        <list>
            <value>/hibernate/Stock.hbm.xml</value>
        </list>
    </property>
</bean>

<bean id="sessionFactory2" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource">
        <ref bean="dataSource2"/>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.connection.isolation">3</prop>    
            <prop key="hibernate.current_session_context_class">jta</prop>    
            <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</prop>    
            <prop key="hibernate.transaction.manager_lookup_class">com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup</prop> 
            <prop key="hibernate.connection.release_mode">on_close</prop>
        </props>
    </property>

    <property name="mappingResources">
        <list>
            <value>/hibernate/Stock1.hbm.xml</value>
        </list>
    </property>
</bean>
任何指点都会大有帮助


感谢

获得在同一事务中执行DAO调用所需的行为,例如,如下所示:

final StockBo stockBo = (StockBo)appContext.getBean("stockBo1");
final StockBo stockBo2 = (StockBo)appContext.getBean("stockBo2");
TransactionTemplate tx = new TransactionTemplate(appContext.getBean(PlatformTransactionManager.class);

tx.execute(new TransactionCallback<Void>() {
    public Void doInTransaction(TransactionStatus ts) {
        /** insert **/
        Stock stock = new Stock();
        stock.setStockCode("7668");
        stock.setStockName("HAIO");
        stockBo.save(stock);

        Stock stock1 = new Stock();
        //stock1.setStockCode("1668"); **Commented to fail the second db insert**
        stock1.setStockName("AAIO");
        stockBo2.save(stock1);

       return null;
    }
});
final StockBo StockBo=(StockBo)appContext.getBean(“stockBo1”);
final StockBo stockBo2=(StockBo)appContext.getBean(“stockBo2”);
TransactionTemplate tx=新的TransactionTemplate(appContext.getBean(PlatformTransactionManager.class));
tx.execute(新建TransactionCallback(){
公共无效交易(交易状态ts){
/**插入**/
股票=新股票();
股票。集合股票代码(“7668”);
股票。集合股票(“HAIO”);
储蓄(股票);
股票1=新股票();
//stock1.setStockCode(“1668”);**注释第二次插入db失败**
库存1.设置库存(“AAIO”);
stockBo2.save(stock1);
返回null;
}
});
另外,我认为您不需要以下行,因为您使用Spring配置Hibernate:

<prop key="hibernate.current_session_context_class">jta</prop>
<prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</prop> 
<prop key="hibernate.transaction.manager_lookup_class">com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup</prop>
<prop key="hibernate.connection.release_mode">on_close</prop>  
jta
org.hibernate.transaction.JTATransactionFactory
com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup
闭上
另请参见:


感谢axtavt的回复和linnk
public static void main( String[] args )
{
    ApplicationContext appContext = 
            new ClassPathXmlApplicationContext("spring/config/appContext.xml");

    StockBo stockBo = (StockBo)appContext.getBean("stockBo1");
    StockBo stockBo2 = (StockBo)appContext.getBean("stockBo2");

    /** insert **/
    Stock stock = new Stock();
    stock.setStockCode("7668");
    stock.setStockName("HAIO");
    stockBo.save(stock);

    Stock stock1 = new Stock();
    //stock1.setStockCode("1668"); **Commented to fail the second db insert**
    stock1.setStockName("AAIO");
    stockBo2.save(stock1);
}
final StockBo stockBo = (StockBo)appContext.getBean("stockBo1");
final StockBo stockBo2 = (StockBo)appContext.getBean("stockBo2");
TransactionTemplate tx = new TransactionTemplate(appContext.getBean(PlatformTransactionManager.class);

tx.execute(new TransactionCallback<Void>() {
    public Void doInTransaction(TransactionStatus ts) {
        /** insert **/
        Stock stock = new Stock();
        stock.setStockCode("7668");
        stock.setStockName("HAIO");
        stockBo.save(stock);

        Stock stock1 = new Stock();
        //stock1.setStockCode("1668"); **Commented to fail the second db insert**
        stock1.setStockName("AAIO");
        stockBo2.save(stock1);

       return null;
    }
});
<prop key="hibernate.current_session_context_class">jta</prop>
<prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</prop> 
<prop key="hibernate.transaction.manager_lookup_class">com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup</prop>
<prop key="hibernate.connection.release_mode">on_close</prop>