分享

Spring中事物管理一二

 昵称7905119 2011-10-12
 由于对Java中的事物管理的概念(本地事物和jta事物)不是很清楚,Google好多文章都是很抽象,希望在论坛中大家提供点比较实际的程序代码案例和必须使用jta事物的场景;好啦,下面给个具体的代码(mybatis,spring),做下说明,我使用两个数据源,两个sqlSessionFactory,两个事物管理器,分别用于两种方式(mybatis的MappBean和MappXML)操作数据库。

 

spring配置如下:

Xml代码 复制代码 收藏代码
  1.     <bean id="dataSource1" class="com.jolbox.bonecp.BoneCPDataSource">  
  2.         <constructor-arg index="0" ref="dbConfig1"/>  
  3.     </bean>  
  4.        
  5.     <bean id="dataSource2" class="com.jolbox.bonecp.BoneCPDataSource">  
  6.         <constructor-arg index="0" ref="dbConfig2"/>  
  7.     </bean>  
  8.   
  9. <!--     <bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean" /> -->  
  10.   
  11.     <bean id="sqlSessionFactory1" class="org.mybatis.spring.SqlSessionFactoryBean">  
  12.         <property name="mapperLocations" value="classpath*:edu/silence/mybatis/dao/**/*.xml" />  
  13.         <property name="dataSource" ref="dataSource1" />  
  14.     </bean>  
  15.     <bean id="sqlSessionFactory2" class="org.mybatis.spring.SqlSessionFactoryBean">  
  16. <!--         <property name="mapperLocations" value="classpath*:edu/silence/mybatis/dao/**/*.xml" /> -->  
  17.         <property name="dataSource" ref="dataSource2" />  
  18.     </bean>  
  19.   
  20.     <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">  
  21.         <constructor-arg index="0" ref="sqlSessionFactory1" />  
  22.     </bean>  
  23.        
  24.     <bean id="userDAO" class="edu.silence.mybatis.dao.impl.userDAO">  
  25.         <property name="sqlSessionTemplate" ref="sqlSession"/>  
  26.     </bean>  
  27.        
  28.     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
  29.         <property name="dataSource" ref="dataSource1" />  
  30.     </bean>  
  31.        
  32.     <bean id="springTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
  33.         <property name="dataSource" ref="dataSource2" />  
  34.     </bean>  
  35.        
  36.     <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">  
  37.         <property name="mapperInterface" value="edu.silence.mybatis.dao.UserMapper" />  
  38.         <property name="sqlSessionFactory" ref="sqlSessionFactory2" />  
  39.     </bean>  
  40.   
  41.     <bean id="userService" class="edu.silence.mybatis.service.impl.UserService">  
  42.         <property name="userMapper" ref="userMapper"/>  
  43.         <property name="userDAO" ref="userDAO"/>  
  44.     </bean>  
  45.        
  46.     <tx:advice id="txAdvice" transaction-manager="springTransactionManager">  
  47.        <tx:attributes>  
  48.             <tx:method name="find*" propagation="REQUIRED" read-only="true"/>  
  49.             <tx:method name="save*" propagation="REQUIRED"/>  
  50.             <tx:method name="update*" propagation="REQUIRED"/>  
  51.             <tx:method name="delete*" propagation="REQUIRED"/>  
  52.             <tx:method name="*" propagation="SUPPORTS"/>  
  53.         </tx:attributes>  
  54.    </tx:advice>  
  55.      
  56.   <tx:advice id="txAdvice1" transaction-manager="transactionManager">  
  57.        <tx:attributes>  
  58.             <tx:method name="find*" propagation="REQUIRED" read-only="true"/>  
  59.             <tx:method name="save*" propagation="REQUIRED"/>  
  60.             <tx:method name="update*" propagation="REQUIRED"/>  
  61.             <tx:method name="delete*" propagation="REQUIRED"/>  
  62.             <tx:method name="*" propagation="SUPPORTS"/>  
  63.         </tx:attributes>  
  64.    </tx:advice>  
  65.       
  66.    <aop:config>  
  67.        <aop:pointcut id="interceptorPointCuts"  
  68.            expression="execution(* *..service.*.*(..))" />  
  69.        <aop:advisor advice-ref="txAdvice"  pointcut-ref="interceptorPointCuts" />  
  70.        <aop:advisor advice-ref="txAdvice1"  pointcut-ref="interceptorPointCuts" />  
  71.    </aop:config>   

 

dao代码如下:

Java代码 复制代码 收藏代码
  1. public class userDAO implements IUserDAO {   
  2.   
  3.     private SqlSessionTemplate sqlSessionTemplate;   
  4.        
  5.     public SqlSessionTemplate getSqlSessionTemplate() {   
  6.         return sqlSessionTemplate;   
  7.     }   
  8.   
  9.     public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {   
  10.         this.sqlSessionTemplate = sqlSessionTemplate;   
  11.     }   
  12.   
  13.     @Override  
  14.     public User findUser(String uid) {   
  15.         return (User) sqlSessionTemplate.selectOne("edu.silence.mybatis.dao.UserMapper.selectByPrimaryKey", uid);   
  16.     }   
  17.   
  18.     @Override  
  19.     public int saveUser(User user) {   
  20.         boolean flag = true;   
  21.         if(flag){   
  22.             throw new RuntimeException("事物回滚......");   
  23.         }   
  24.         return sqlSessionTemplate.insert("edu.silence.mybatis.dao.UserMapper.insertSelective", user);   
  25.     }   
  26.   
  27. }  

 

业务层代码如下:

Java代码 复制代码 收藏代码
  1. private UserMapper userMapper;   
  2.   
  3. private IUserDAO userDAO;   
  4.   
  5. public UserMapper getUserMapper() {   
  6.     return userMapper;   
  7. }   
  8.   
  9. public void setUserMapper(UserMapper userMapper) {   
  10.     this.userMapper = userMapper;   
  11. }   
  12.   
  13. public IUserDAO getUserDAO() {   
  14.     return userDAO;   
  15. }   
  16.   
  17. public void setUserDAO(IUserDAO userDAO) {   
  18.     this.userDAO = userDAO;   
  19. }   
  20.   
  21. @Override  
  22. public User findUser(String uid) {   
  23.     // TODO Auto-generated method stub   
  24.     return null;   
  25. }   
  26.   
  27. @Override  
  28. public int saveUser(User user) {   
  29.     user.setUid(UUID.randomUUID().toString());   
  30.     int i = userMapper.insert(user);   
  31.     user.setAlias("就是我");   
  32.     user.setUid(UUID.randomUUID().toString());   
  33.     int j = userDAO.saveUser(user);   
  34.     if(i!=1 && j!=1){   
  35.         throw new RuntimeException("事物回滚......");   
  36.     }   
  37.     return i+j;   
  38. }   
 

测试代码如下:

Java代码 复制代码 收藏代码
  1. public static void main(String[] args) {   
  2.     ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath*:**/*application*.xml");   
  3.     IUserService service = ctx.getBean("userService", IUserService.class);   
  4.     User user = new User();   
  5.     user.setAlias("Silence");   
  6.     user.setBirthday(new Date());   
  7.     user.setEmail("silence@email.com");   
  8.     user.setGender(1);   
  9.     user.setMobile("18674970916");   
  10.     user.setPassword("silence");   
  11.     user.setPhoto("head.jpg");   
  12.     user.setRealname("china");   
  13.     user.setRole(1);   
  14.     user.setStudystep(1);   
  15.     user.setUsername("silence");   
  16.     service.saveUser(user);   
  17. }  

 

上面使用本地事物,都能正常保存,如果失败都可以同时回滚,所以不明白jta到里在那个具体场景必须使用;也请各位讲解下上面代码在事物性方面有那些问题。

 

在下先O(∩_∩)O谢谢!!!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多