`
collin000
  • 浏览: 3011 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

JTA不能回滚的问题!

阅读更多

现在公司项目就要开始了, 用 struts2 hibernate spring  开发,.

已经确定使用2个sql server 数据库(sql 2005).  于是使用JTA, jotm 实现分布式事务.

我按照网上搜索的方式配置, 有两个数据源, 产生两个sessionFactory, 但却发现事务无法回滚!!!

看网上说sql 2005 要实现 XA, 需要增加几步操作, 要考一个文件到Binn目录下, 然后执行一个存储过程.

我试了一下, 还是不行.

这个是我测试项目的代码,  就实现一个最简单的插入数据, 也不知道究竟是项目问题还是数据库问题, 总之就是不能回滚~~~

哪位朋友有使用过的经验, 求教! 万分感谢!

以下是spring完整配置:

java 代码
  1. <!---->"1.0" encoding="UTF-8"?>   
  2. <!---->"-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">   
  3.   
  4. <beans></beans>  
  5.   
  6.     <import resource="classpath:org/codehaus/xfire/spring/xfire.xml"/>   
  7.     "HelloBean" class="com.powerapps.webservice.HelloImpl" />   
  8.        
  9.     "jotm" class="org.springframework.transaction.jta.JotmFactoryBean"/>    
  10.     "transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">    
  11.         "userTransaction">"jotm"/>    
  12.        
  13.   
  14.     "dataSourceA" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown">      
  15.         "dataSource">      
  16.             class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown">      
  17.                 "transactionManager">      
  18.                     "jotm" />      
  19.                       
  20.                 "driverName">      
  21.                     <value></value>com.microsoft.sqlserver.jdbc.SQLServerDriver      
  22.                       
  23.                 "url">      
  24.                     <value></value>jdbc:sqlserver://192.168.1.63:1433;selectMethod=cursor;DatabaseName=eHR;      
  25.                       
  26.                   
  27.               
  28.         "user">      
  29.             <value></value>mohr      
  30.               
  31.         "password">      
  32.             <value></value>javadev      
  33.               
  34.            
  35.   
  36.        
  37.     <!---->   
  38.     "sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">   
  39.        
  40.         <!---->   
  41.   
  42.         "mappingResources">   
  43.              <list></list>           
  44.                     <value></value>com/powerapps/model/base/Dictinfo.hbm.xml            
  45.                     <value></value>com/powerapps/model/base/Subdictinfo.hbm.xml   
  46.                        
  47.                
  48.            
  49.   
  50.   
  51.         "dataSource">   
  52.             "dataSourceA" />   
  53.            
  54.         "jtaTransactionManager">      
  55.             "jotm" />      
  56.               
  57.            
  58.         "hibernateProperties">   
  59.              <props></props>   
  60.                 "hibernate.dialect">org.hibernate.dialect.SQLServerDialect   
  61.                 "hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory   
  62.                 "hibernate.show_sql">true   
  63.                
  64.            
  65.        
  66.        
  67.     "dataSourceB" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown">      
  68.         "dataSource">      
  69.             class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown">      
  70.                 "transactionManager">      
  71.                     "jotm" />      
  72.                       
  73.                 "driverName">      
  74.                     <value></value>com.microsoft.sqlserver.jdbc.SQLServerDriver      
  75.                       
  76.                 "url">      
  77.                     <value></value>jdbc:sqlserver://192.168.1.63:1433;selectMethod=cursor;DatabaseName=test;      
  78.                       
  79.                   
  80.               
  81.         "user">      
  82.             <value></value>mohr      
  83.               
  84.         "password">      
  85.             <value></value>javadev      
  86.               
  87.            
  88.   
  89.        
  90.     <!---->   
  91.     "sessionFactoryB" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">   
  92.        
  93.         <!---->   
  94.   
  95.         "mappingResources">   
  96.              <list></list>           
  97.                     <value></value>com/powerapps/model/base/Positioninfo.hbm.xml            
  98.                
  99.            
  100.   
  101.   
  102.         "dataSource">   
  103.             "dataSourceB" />   
  104.            
  105.         "jtaTransactionManager">      
  106.             "jotm" />      
  107.               
  108.            
  109.         "hibernateProperties">   
  110.              <props></props>   
  111.                 "hibernate.dialect">org.hibernate.dialect.SQLServerDialect   
  112.                 "hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory   
  113.                 "hibernate.show_sql">true   
  114.                
  115.            
  116.        
  117.        
  118.        
  119.     "daoB" class="com.powerapps.dao.base.impl.DaoImplB">   
  120.         "sessionFactory">   
  121.             "sessionFactoryB" />   
  122.            
  123.        
  124.        
  125.     "txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">       
  126.         "transactionManager">     
  127.             "transactionManager"/>     
  128.                
  129.         "transactionAttributes">       
  130.              <props></props>      
  131.                 "get*">PROPAGATION_REQUIRED   
  132.                 "*">PROPAGATION_REQUIRED     
  133.                    
  134.                
  135.             
  136.          
  137.          
  138.     "dictProxy" parent="txProxyTemplate" >     
  139.         "target">       
  140.             class="com.powerapps.service.admin.base.impl.DictManagerImpl">       
  141.                 "sessionFactory">"sessionFactory" />   
  142.                 "daoB">"daoB" />               
  143.                    
  144.                
  145.        
  146.   
  147.   
  148.     "positionProxy" parent="txProxyTemplate" >     
  149.         "target">       
  150.             class="com.powerapps.service.admin.base.impl.PositionManagerImpl">       
  151.                 "sessionFactory">"sessionFactoryB" />              
  152.                    
  153.                
  154.        
  155.   
  156.     "DictAction" class="com.powerapps.action.admin.base.DictAction" singleton="false" autowire="byName">   
  157.        
  158.   
  159.     "SubDictAction" class="com.powerapps.action.admin.base.SubDictAction" singleton="false" autowire="byName">   
  160.        
  161.   
  162.   
  163.   

以下是在struts action中代码:

java 代码
  1. public String test()   
  2. {   
  3.    dictProxy.testJta();   
  4.   
  5.    return "DictSearchPage";   
  6. }   

 

以下是中间层的代码:  中间曾继承了一个 BaseManagerImpl,  而 BaseManagerImpl 又继承了  BaseDaoImpl

save方法就是 BaseDaoImpl 中实现的.  以下代码中头两条记录都插入进分别的库了, 应该是回滚才对!

java 代码
  1. public void testJta()   
  2. {   
  3.     try  
  4.     {   
  5.     Dictinfo aDictinfo = new Dictinfo();   
  6.     aDictinfo.setName("111");   
  7.         super.saveObject(aDictinfo);       
  8.                  //数据库1  继承过来 BaseDaoImpl 的sessionsessionFactory   
  9.   
  10.         Positioninfo position = new Positioninfo();   
  11.         position.setName("111");   
  12.         daoB.saveObject(position);         
  13.                  //数据库2  daoB中的sessionsessionFactory   
  14.   
  15.         Dictinfo dictinfo = new Dictinfo();   
  16.         super.saveObject(dictinfo);        
  17.                  //Name字段不能为空, 出错拉, 应该把之前的插入都回滚   
  18.     }   
  19.     catch(Exception e)   
  20.     {   
  21.         e.printStackTrace();   
  22.     }   
  23.        
  24. }   
分享到:
评论
12 楼 heartsong 2007-09-26  
建议用编程式的事务处理。

即类似:
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
DataSourceTransactionManager txManager = (DataSourceTransactionManager) BeanFactory.getBeanByName("txManager");
TransactionStatus status = txManager.getTransaction(def);
try{
    //要处理的过程 
}
catch (Exception ex) {
    //在这里处理rollback
    txManager.rollback(status);
    log.info("ROLLBACK!");
    throw ex;
}
txManager.commit(status);
11 楼 collin000 2007-09-26  
to 楼上:
我想JTA应该是没啥问题, 毕竟是j2ee标准组件, 至于jotm就拿不准了, 它官方2年多没更新了...
哎. 发现要学的东西太多了, 都排成大队了.

PS: 莫非楼上在东京? 强~~~
10 楼 ddandyy 2007-09-26  
现在JTA已经比较好了吧  反正我们这用着还是不错的
现在的版本也比以前快了很多
9 楼 collin000 2007-09-26  
首先非常感谢daquan198163的回答, 终于可以回滚了, 但是在oracle10g下, sql2005下仍然不行. (正在处理中...有经验的朋友请指教啊!!!)
看来程序没有问题, 是数据库没有配好的原因(sql对j2ee支持真是垃圾, oracle什么都不用配).

现在还有几个问题:

1 我的程序没有抛异常(throw new RuntimeException()),但确实是回滚了. 这点和文档与书上说的有点出入, 不知是怎么回事? (以前作单数据源时根本没有在意这件事, 测试一下可以回滚就没有理了) 不过这个是小问题!

2 这个是关于Session的使用.
记得robbin曾经总结说: 使用JTA时是先启动事务, 在这个全局事务范围内会启动多个session, 而hibernate则先打开session再启动事务, 顺序正好相反.
我试了试OpenSessionInView模式, 可以正常使用.
这样是不是说像
Session session = getSession()
session.方法(...)

这样的代码就只能用于读数据,写数据就有问题了? 目前还没试过.

3 我问了一个朋友, 他有很多年经验了. 说JTA事务是比较占资源的, 并且jotm的bug比较多, 使用它们的话不合算, 干脆就不用分布事务. 我想请教一下各位大牛关于这些的看法.
8 楼 daquan198163 2007-09-24  
如果这样还不行,只能怀疑SqlServer的问题了

抛异常是必要条件
7 楼 collin000 2007-09-24  
谢谢 daquan198163 回答, 我testJta把代码改为:

    catch(Exception e)
    {
    throw new RuntimeException();
    }

仍然不行啊... 

顺便说句, 我以前单数据源作的时候都没有抛异常的, 却回滚了...
抛不抛异常是必要条件吗?
6 楼 daquan198163 2007-09-24  
不抛异常spring不会回滚事务的
5 楼 collin000 2007-09-24  
to daquan198163:
不明白你的意思, 我这个异常捕捉纯粹是为了在控制台看异常情况, 没有其他任何作用的. (我这个只是测试项目, 只是为了测试分布事务)
4 楼 daquan198163 2007-09-24  
问题出在这里:
# catch(Exception e)  
#     {  
#         e.printStackTrace();  
#     }
建议补习一下Spring基础
3 楼 collin000 2007-09-24  
多谢上面两位关注!
回 daquan198163:

配事务了, testJta方法是 dictProxy 中的方法.

<bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">   
    <property name="transactionManager"> 
        <ref bean="transactionManager"/> 
    </property>   
    <property name="transactionAttributes">   
        <props> 
<prop key="get*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED</prop> 
        </props>   
    </property>   
</bean>  
 
 

<bean id="dictProxy" parent="txProxyTemplate" > 
    <property name="target">   
        <bean class="com.powerapps.service.admin.base.impl.DictManagerImpl">   
<property name="sessionFactory"><ref bean="sessionFactory" /></property>
<property name="daoB"><ref bean="daoB" /></property>        
</bean>   
    </property>   
</bean>
2 楼 daquan198163 2007-09-24  
<br/>
<strong> </strong>
<div class='quote_div'><strong>以下是中间层的代码:  中间曾继承了一个 BaseManagerImpl,  而 BaseManagerImpl 又继承了  BaseDaoImpl<span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><font><font>
<p>save方法就是 BaseDaoImpl 中实现的.  以下代码中头两条记录都插入进分别的库了, 应该是回滚才对!</p>
<div class='code_title'>
<div class='code_title'>java 代码</div>
<div class='dp-highlighter'>
<div class='bar'> </div>
<ol class='dp-j'>
    <li class='alt'><span><span class='keyword'>public</span><span> </span><span class='keyword'>void</span><span> testJta()   </span></span> </li>
    <li class=''><span>{   </span> </li>
    <li class='alt'><span>    </span><span class='keyword'>try</span><span>  </span> </li>
    <li class=''><span>    {   </span> </li>
    <li class='alt'><span>    Dictinfo aDictinfo = </span><span class='keyword'>new</span><span> Dictinfo();   </span> </li>
    <li class=''><span>    aDictinfo.setName(</span><span class='string'>"111"</span><span>);   </span> </li>
    <li class='alt'><span>        </span><span class='keyword'>super</span><span>.saveObject(aDictinfo);       </span> </li>
    <li class=''><span>                 </span><span class='comment'>//数据库1  继承过来 BaseDaoImpl 的sessionsessionFactory </span><span>  </span> </li>
    <li class='alt'><span>  </span> </li>
    <li class=''><span>        Positioninfo position = </span><span class='keyword'>new</span><span> Positioninfo();   </span> </li>
    <li class='alt'><span>        position.setName(</span><span class='string'>"111"</span><span>);   </span> </li>
    <li class=''><span>        daoB.saveObject(position);         </span> </li>
    <li class='alt'><span>                 </span><span class='comment'>//数据库2  daoB中的sessionsessionFactory </span><span>  </span> </li>
    <li class=''><span>  </span> </li>
    <li class='alt'><span>        Dictinfo dictinfo = </span><span class='keyword'>new</span><span> Dictinfo();   </span> </li>
    <li class=''><span>        </span><span class='keyword'>super</span><span>.saveObject(dictinfo);        </span> </li>
    <li class='alt'><span>                 </span><span class='comment'>//Name字段不能为空, 出错拉, 应该把之前的插入都回滚 </span><span>  </span> </li>
    <li class=''><span>    }   </span> </li>
    <li class='alt'><span>    </span><span class='keyword'>catch</span><span>(Exception e)   </span> </li>
    <li class=''><span>    {   </span> </li>
    <li class='alt'><span>        e.printStackTrace();   </span> </li>
    <li class=''><span>    }   </span> </li>
    <li class='alt'><span>       </span> </li>
    <li class=''><span>}   </span> </li>
</ol>
</div>
</div>
</font></font></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></strong></div>
<strong><br/>
<br/>
这个<span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><font><font><span><span>testJta方法配了事务了么?</span></span></font></font></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><br/>
</strong>
1 楼 whistler 2007-09-24  
关注中,希望有经验得朋友能够给个思路

相关推荐

    jta使用手册,jta帮助文档jta使用手册,jta帮助文档

    2. **TransactionManager**:为事务管理器提供访问点,应用程序通常不直接调用。 3. **javax.transaction.Status**:定义事务的状态常量,如`STATUS_ACTIVE`、`STATUS_COMMITTED`等。 #### 实现考虑 在实现JTA时,...

    最新的JTA规范.pdf

    JTA规范文档明确指出了其版权归属于Sun Microsystems Inc.,并详细描述了一个非专有、不可转让的全球性许可证条款,允许开发者免费使用JTA规范来创建和分发该规范的实现,但前提是这些实现不得衍生自Sun的源代码或二...

    jta.jar包;jta.jar包

    1. **UserTransaction**: 这是JTA的入口点,提供开始、提交、回滚和查询当前事务的方法。程序员可以通过Java的`javax.transaction.UserTransaction`接口来使用它。 2. **TransactionManager**: 它负责事务的生命...

    Spring配置JTA事务管理

    - JTA的并发问题:在多线程环境下,你需要理解如何避免死锁和其他并发问题。 最后,提到的`ibatis`文件可能是MyBatis的配置或者相关代码。MyBatis是一个优秀的持久层框架,它可以与Spring的JTA事务管理无缝集成。在...

    JTA1.1规范(sun)

    总的来说,JTA 1.1规范是Java EE开发中不可或缺的一部分,它提供了标准的接口和实现,使得开发人员能够编写出高效、可靠的分布式事务处理代码,从而提高整个系统的可用性和可靠性。通过深入学习JTA 1.1规范及其提供...

    jta1.1-doc

    - **补偿事务( Compensation-based Transactions)**:通过定义回滚操作(补偿操作),JTA 1.1支持在事务失败时进行回滚恢复。 - **JTA与JPA/EJB集成**:在Java EE环境中,JTA与JPA(Java Persistence API)和EJB...

    spring jta

    - UserTransaction:这是JTA的核心接口,用于开始、提交、回滚事务。 - TransactionManager:管理事务,处理事务的开始、提交、回滚,以及事务的隔离级别和超时设置。 - Resource Manager:例如数据库或消息队列...

    Jta的jar包

    描述中提到了"jbarcode-0.2.8"和"jbarcodebean-1.2.0",这是关于Java条形码生成库JBarcode的不同版本,但主要关注点是JTA,因为"jta-1.0.1B"和"jta-1.1"再次被提及。这表明讨论的是用于处理分布式事务的Java技术。 ...

    JTA-demo说明文档.doc

    这个文档可能还会解释如何处理常见的问题,比如事务超时、死锁和并发冲突等。 总的来说,理解和掌握JTA对于开发大型、分布式的企业级应用至关重要,因为它能够保证在复杂环境下的数据完整性,提升系统的可靠性。...

    EJB中的JTA与JTS例子代码

    EJB中的JTA与JTS例子代码,JTA是一种高层的,与实现无关的,与协议无关的J2ee API,应用程序和应用服务器可以使用JTA来访问事务。JTS则规定了支持JTA的事务管理器的实现规范,在高层API之下实现了OMG Object ...

    spring + JTA + atomikos 实现分布式事务

    2. 事务超时和回滚:处理好事务的超时策略,以及在异常情况下如何正确回滚事务,防止数据不一致。 3. 数据库兼容性:不是所有的数据库都支持X/Open XA协议,因此在选择数据库时需要考虑其对分布式事务的支持。 总之...

    分布式事务操作之Spring+JTA+mybatis源码

    分布式事务在现代企业级应用中扮演着至关重要的角色,特别是在多服务、微服务架构中,确保数据的一致性和完整性是必不可少的。本话题主要聚焦于如何在Spring框架中结合Java Transaction API (JTA) 和 MyBatis 实现...

    JTA1.2规范

    JTA 1.2 规范是 Java 社区为解决分布式事务问题而制定的一项重要标准。通过对事务管理器、资源管理器以及应用服务器之间的交互进行规范化的定义,JTA 1.2 提供了一种统一且高效的方式来处理复杂的分布式事务。无论是...

    quartz_jta_collections

    例如,当一个任务涉及到对多个数据库的修改时,JTA可以确保所有更改要么全部成功,要么全部回滚,防止数据不一致。jta-1.1.jar提供了对JTA规范的实现,使得Quartz能够参与全局事务。 3. **Commons-Collections.jar*...

    springboot+jta+atomikos

    它为开发人员提供了一种简单、高效的方式来处理复杂的分布式环境下的事务问题,极大地提升了系统的稳定性和可扩展性。在实际项目中,这样的解决方案可以应用于银行系统、电子商务平台等对数据一致性要求极高的场景。

    多数据源事务之解决方案jta+atomikos

    Atomikos不仅仅是一个简单的JTA实现,它还包含了一些高级特性,如事务超时、事务恢复、事务日志、以及基于JMX的监控工具,这使得开发者可以更方便地处理复杂的分布式事务场景。 使用JTA和Atomikos进行多数据源事务...

    JTA分布式事务使用示例代码

    本示例代码旨在展示如何在Java环境中使用JTA来解决多数据源的事务问题。 首先,我们需要了解JTA的基本概念。JTA定义了两个主要组件:Transaction Manager(事务管理器)和XAResource(事务资源)。事务管理器负责...

    geronimo-jta_1.1_spec-1.1-sources.jar.zip

    每种隔离级别都有其特定的并发控制策略,防止脏读、不可重复读和幻读等问题。 此外,Geronimo JTA还遵循特定的回滚规则,例如,当发生未检查异常(如RuntimeException)时,事务会自动回滚,以保持数据的一致性。 ...

    java实现JTA简单例子

    Java JTA,全称为Java Transaction API,是Java平台上的事务处理标准,用于管理跨系统或跨资源的事务。它提供了一种统一的方式来控制应用程序中的事务,使得开发者可以在不同的数据库、消息队列等资源之间进行协调,...

    jta hibernate spring 集成 代码和说明

    通过JTA,应用程序可以在一个事务中执行多个操作,确保所有操作要么全部成功,要么全部回滚,实现了ACID(原子性、一致性、隔离性和持久性)特性。 **Hibernate ORM** Hibernate是一个流行的Java对象关系映射(ORM...

Global site tag (gtag.js) - Google Analytics