鹿血复合片一大盒几粒:Spring中事物管理一二

来源:百度文库 编辑:九乡新闻网 时间:2024/04/29 11:11:24
 由于对Java中的事物管理的概念(本地事物和jta事物)不是很清楚,Google好多文章都是很抽象,希望在论坛中大家提供点比较实际的程序代码案例和必须使用jta事物的场景;好啦,下面给个具体的代码(mybatis,spring),做下说明,我使用两个数据源,两个sqlSessionFactory,两个事物管理器,分别用于两种方式(mybatis的MappBean和MappXML)操作数据库。

 

spring配置如下:

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

 

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谢谢!!!